具有嵌入式聊天(会话视图)
这不仅仅是Rails的更多 - 你必须调查异步连接,其中Pusher或Socket.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
操作定义。
我会有一个不同的控制器来处理聊天,并在iframe中调用它,传递相关的用户ID和任务ID作为参数。然后,您可以使用部分或帮助器来调用它,并在想要显示聊天箱的任何位置包含此部分/帮助器。 –