我创建了一个项目,其中有一个客户和另一个承包商。我实现了用于聊天的ruby on rails actioncable。一切都很顺利,但问题来了,当两个不同的人与一个人聊天时,这个人在套接字窗口中同时接收两条消息。我意识到我已经设置了conversation-#{user_id}作为一个通道,所以用户正在收听这个通道,现在有两个人给他发聊天,他们都会在同一个通道上。我怎样才能避免这种情况?或者我可以在频道字符串中添加另一个用户,但我发现这非常困难。任何想法,我必须发送参数到订阅方法。
连接
module ApplicationCable
class Connection < ActionCable::Connection::Base
identified_by :current_user
def connect
self.current_user = find_session_user
end
def find_session_user
current_user = User.find_by(id: cookies.signed[:actioncable_user_id])
current_user || reject_unauthorized_connection
end
end我的对话频道
class ConversationChannel < ApplicationCable::Channel
def subscribed
stream_from "conversations-#{current_user.id}"
end
def unsubscribed
stop_all_streams
end
def speak(data)
message_params = data["message"].each_with_object({}) do |el, hash|
hash[el.values.first] = el.values.last
end
end
ActionCable.server.broadcast(
"conversations-#{current_user.id}",
message: message_params,
)
end这段代码只是一个压缩版本,但由于它将启动一个通道,所以当它连接到其他人发送消息时,该用户将在同一套接字中接收它们。所以我必须这样做,就像` so user_id-anotehr_user一样。现在它在web/mobile上工作,一切都很好,但当两个用户与一个用户通信时,它会在一个插口上显示两个用户的聊天,这会产生问题。
有什么办法可以创建这样的频道吗?
发布于 2019-11-28 18:02:08
我已经解决了这个问题与2个人绑定聊天,我有另一个工作特定的聊天要求,所以我也绑定了它。现在我的对话通道就像对话-(Talk_id)-(Listern_id)-job_id,所以现在一切都好了。我从assets/javascript中删除了频道文件,因为它会自动加载到我的应用程序中,但我想用几个参数来绑定它,所以我将它添加到特定的视图中。我的控制器已经有了很少的参数,所以我将这个javascript改为如下
<script>
App.conversation = App.cable.subscriptions.create({channel: "ConversationChannel",
job_id: <%= @job.id %>,
contractor: <%= @contractor %>
}, {
connected: function() {},
disconnected: function() {},
received: function(data) {
var conversation = $('#conversations-list').find("[data-conversation-id='" + data['conversation_id'] + "']");
conversation.find('.messages-list').find('ul').append(data['message']);
var messages_list = conversation.find('.messages-list');
var height = messages_list[0].scrollHeight;
messages_list.scrollTop(height);
},
speak: function(message) {
return this.perform('speak', {
message: message
});
}
});现在,当连接建立时,它正确地分别发送参数和通道通道。在我的conversation.rb上,我只有很小的变化
def subscribed
stream_from "conversations-#{current_user.id}-#{params[:contractor]}-#{params[:job_id]}"
end现在一切都按照我们的要求完美地工作,每个频道都有2个users+job Id,这样他们就可以在特定的工作和特定的用户之间进行交流,所以没有其他人可以监听其他的对话。只是发帖可能会对某些人有所帮助。
https://stackoverflow.com/questions/58876848
复制相似问题