多用户聊天接收动作电缆

multiple users chat receiving on action-cable

我创建了一个项目,其中有一个客户和另一个承包商。我在 rails actioncable 上实现了 ruby 用于聊天。一切进展顺利,但当两个不同的人与一个人聊天时,问题就来了,那个人正在套接字 window 中接收两条消息。我意识到我已经将 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

此代码只是精简版,但由于它将 conversation-user_id 作为通道启动,因此肯定当它连接并且其他人发送消息时,该用户将在同一个套接字中接收它们。所以我必须像 `conversation-user_id-anotehr_user 那样做。现在它正在 web/mobile 上工作,一切都很好,但是当两个用户与一个用户通信时,它会通过在一个套接字上显示两个用户聊天而产生问题。

知道如何创建这样的频道。

我已经通过绑定2人聊天解决了这个问题,我还有一个工作特定聊天的需求,所以也绑定了它。现在我的对话频道就像 conversation-(talk_id)-(listern_id)-job_id 所以一切都很好。以下是我所做的更改 1. 我从 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 个用户 + 工作 ID 组成,这样我就可以就特定工作和特定用户进行交流,这样就没有其他人可以听到其他对话了。 只是发帖可能会对某人有所帮助。