1

我有一个导轨应用程序。还有一个用户,一个任务和对话模型。用户可以将任务分配给对方。一项任务总是属于2个用户,一个分配者和一个执行者。当涉及更多型号时,导轨可以访问其他控制器/型号

  1. 在用户页面显示(和任务显示页。)我想有一个嵌入式的聊天(会话视图),所以用户可以谈对方实时。

  2. 如果已经至少分配了一个任务,我希望创建对话(与任务相同,仅限2个用户)。

  3. 我将为对话模型使用first_or_create方法,因此如果2个用户之前已经聊天过,那么他们可以继续之前的对话,因此只有2个给定用户之间会有一个对话。

  4. 任务与会话之间没有直接关系,除了belongs_to 2个用户。 2个给定的用户将具有相同的对话窗口,用于他们在一起的所有任务。

所以一句话,我想如果至少一个任务存在显示用户展示页面上的谈话,然后检查是否会话已经存在(如果它再继续,否则创建)。这涉及3个控制器和3个模型,我完全不知道在哪里放置和访问不同的方法。

我的问题:我应该在哪里(控制器/模型,哪一个)放置if/else语句来检查在给定用户之间是否至少分配了一个任务?在创建/检查对话时如何引用该方法?当我尝试访问用户显示页面时,需要通过哪些参数才能够检查任务情况并在需要时显示对话?我还应该考虑什么?

+1

我会有一个不同的控制器来处理聊天,并在iframe中调用它,传递相关的用户ID和任务ID作为参数。然后,您可以使用部分或帮助器来调用它,并在想要显示聊天箱的任何位置包含此部分/帮助器。 –

回答

0

具有嵌入式聊天(会话视图)

这不仅仅是Rails的更多 - 你必须调查异步连接,其中PusherSocket.io可以提供(作为延伸喜欢到Rails的)。


凡(控制器/模型,其中一个)我应该把的if/else 语句来检查,如果有 2给定用户之间分配至少一个任务是什么?

要使其成为“实时”,您将必须有一个单独的chats控制器,您的Web套接字将持续ping。聊天记录可以通过聊天控制器本身的授权启动,让您能够确定是否应该加载或刷新聊天。

因此,你会把它放在控制器

型号用于构建和阐明数据。如果您不构建数据,则无需访问模型。控制器是逻辑应该去的地方:

#app/models/user.rb 
class User < ActiveRecord::Base 
    has_many :chats #-> @user.chats.first.recipient 
end 

#app/models/chat.rb 
class Chat < ActiveRecord::Base 
    has_many :messages 
    belongs_to :master, class_name: "User", foreign_key: :user_id 
    belongs_to :recipient, class_name: "User", foreign_key: :recipient_id 
end 

#app/models/message.rb 
class Message < ActiveRecord::Base 
    belongs_to :chat 
    #will have to associate users here 
end 

这些是你应该使用的模型。

如果你让他们正确设置,它会给你打电话以下的能力:

#config/routes.rb 
resources :users do 
    resources :chats, only: [:index, :new, :create, :update] #-> url.com/users/:user_id/chats/:id 
end 

#app/controllers/chats_controller.rb 
class ChatsController < ApplicationController 
    def index 
     @user = User.find params[:id] 
     if @user.chats.where(recipient: current_user).any? 
      # invoke chat here 
     else 
      # do something else 
     end 
    end 
end 

创建/检查时的谈话如何指的是方法?

参考对话的方式是使用Ajax

没有不是“正常”的Ajax,相当于WebSockets。我有限的经验,但在非常相似的方式都工作(从开发者的角度来看):

  • JS在你的视图中打开一个URL
  • 的URL响应无论是作为连接或不
  • 异步连接
  • 如果连接,websocket保持连接;标准的AJAX切断

如果使用的喜欢,你就可以建立你自己的一部分,没有开销的WebSocket基础设施(他们的服务器处理所有的连接)。

你必须建立一个路线(如上),给你一个方法来检索你需要的任何数据。然后,您将在页面上设置JS以在文档准备就绪后运行

加载后,您将能够ping控制器操作 - 它将决定如何处理请求。逻辑应该是这样的:

  • JS将ping chats控制器(类似于上文)
  • chats控制器检查存在的“聊天”两个用户(show用户和如果存在current_user
  • 之间,提取数据并发送回
  • 如果不存在,创建一个新的
  • JS需要响应,并利用它在DOM
  • 推等均会为您提供实时更新数据的能力

无论如何,您基本上需要从任一用户那里检索“聊天”数据。如果不存在聊天,则发回新的聊天窗口或错误。如果它确实存在,则发送JSON数据。

当我尝试访问用户显示页面以便能够检查任务情况并在需要时显示对话时,需要传递什么参数?

我不知道任务怎么会进入这个;我所知道的是,您通过异步连接(IE AJAX或Websocks)发送请求,如果您发送同步连接,您将获得所有参数。

因此,从上面的示例中,您将能够看到您可以将您的ping请求发送到url.com/users/:user_id/chats:user_id将由您将浏览的show操作定义。

+0

嗨Rich,已经使用private_pub gem(faye)完成聊天。它工作正常,我用这个啧啧作为模板:http://bit.ly/1MbrEio。我唯一的问题,这个解决方案,你不得不点击按钮来调用它,不像我上面提到的。我的模型和你写的一样。唯一的区别是路由。对话模式(在您呼叫时聊天)不属于用户资源,因为我只在其他模型的视图中将其用作部分视图。我可能不得不根据你的建议来改变这个。请看看这个问题,它以不同的方式属于这个问题:http://bit.ly/1OgesgF –

+0

不错的教程:)我保存它,谢谢! –

+0

关于路线,我只是说出你所说的:'在用户展示页面上'。由于您有一个用户显示页面,您可以通过它发送聊天请求URL以获取您想要ping的用户的参数 –