首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >多用户在action cable上接收聊天

多用户在action cable上接收聊天
EN

Stack Overflow用户
提问于 2019-11-15 20:13:31
回答 1查看 664关注 0票数 1

我创建了一个项目,其中有一个客户和另一个承包商。我实现了用于聊天的ruby on rails actioncable。一切都很顺利,但问题来了,当两个不同的人与一个人聊天时,这个人在套接字窗口中同时接收两条消息。我意识到我已经设置了conversation-#{user_id}作为一个通道,所以用户正在收听这个通道,现在有两个人给他发聊天,他们都会在同一个通道上。我怎样才能避免这种情况?或者我可以在频道字符串中添加另一个用户,但我发现这非常困难。任何想法,我必须发送参数到订阅方法。

连接

代码语言:javascript
复制
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

我的对话频道

代码语言:javascript
复制
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上工作,一切都很好,但当两个用户与一个用户通信时,它会在一个插口上显示两个用户的聊天,这会产生问题。

有什么办法可以创建这样的频道吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-11-28 18:02:08

我已经解决了这个问题与2个人绑定聊天,我有另一个工作特定的聊天要求,所以我也绑定了它。现在我的对话通道就像对话-(Talk_id)-(Listern_id)-job_id,所以现在一切都好了。我从assets/javascript中删除了频道文件,因为它会自动加载到我的应用程序中,但我想用几个参数来绑定它,所以我将它添加到特定的视图中。我的控制器已经有了很少的参数,所以我将这个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上,我只有很小的变化

代码语言:javascript
复制
  def subscribed
    stream_from "conversations-#{current_user.id}-#{params[:contractor]}-#{params[:job_id]}"
  end

现在一切都按照我们的要求完美地工作,每个频道都有2个users+job Id,这样他们就可以在特定的工作和特定的用户之间进行交流,所以没有其他人可以监听其他的对话。只是发帖可能会对某些人有所帮助。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58876848

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档