【问题标题】:multiple users chat receiving on action-cable多个用户在 action-cable 上聊天接收
【发布时间】:2020-03-11 14:18:53
【问题描述】:

我创建了一个项目,其中有一个客户和另一个承包商。我在 Rails actioncable 上实现了 ruby​​ 用于聊天。一切都很好,但是当两个不同的人与一个人聊天时,问题就来了,那个人正在套接字窗口中接收两条消息。我意识到我已经将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。现在它正在网络/移动设备上运行,一切都很好,但是当两个用户与一个用户通信时,它会通过在一个套接字上显示两个用户聊天来产生问题。

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

【问题讨论】:

    标签: ruby-on-rails websocket actioncable


    【解决方案1】:

    我已经通过绑定两个人的聊天解决了这个问题,我还有一个工作特定聊天的要求,所以也绑定了它。现在我的对话频道就像对话-(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 组成,因此我他们可以就特定工作和特定用户进行交流,因此其他人无法收听其他对话。 只是发布可能会对某人有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-02-24
      • 2018-11-15
      • 1970-01-01
      • 2018-03-10
      • 2023-03-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多