【问题标题】:How to broascast message to client not subcribe for a topic in Action Cable如何向未订阅 Action Cable 中的主题的客户端广播消息
【发布时间】:2018-09-17 07:21:26
【问题描述】:

我想使用 Action Cable (Rails 5) 创建聊天应用。

当客户端登录应用程序时,我发送消息订阅频道。频道将根据current_userroom_id 进行连接流式传输。 当用户发送消息时,它将发送给所有订阅频道的人 那是动作电缆的正常流动。

这是我的频道:

class RoomChannel < ApplicationCable::Channel
  def subscribed
   current_user.chatrooms.each do |chatroom|
       stream_from "room_#{chatroom.id}"
   end
 end
end

但我想知道客户端何时将消息发送给不在房间的新用户。未创建流式传输。对方如何才能收到消息并继续进行对话?

【问题讨论】:

    标签: ruby-on-rails actioncable


    【解决方案1】:

    对于发送消息的用户,您可以在消息模型中创建一个回调,该回调会在创建消息时广播到您的频道。我假设您创建了正确的关联。即房间has_many 消息。依次留言belongs_toRoomUser 像这样的:

    class Message < ApplicationRecord
        after_create :broadcast_to_room
        .......
        private
        def broadcast_to_room
            @room = self.room
            RoomChannel.broadcast_to(@room, message: self)
        end
        .........
    end
    

    因此,每当创建消息时,都会将其广播到消息所属的房间。 你的 RoomChannel 可以是这样的:

    class RoomChannel < ApplicationCable::Channel
        def subscribed
            room = Room.find(params[:id])
            stream_for room
        end
    end
    

    现在在房间的首页,你应该有一个订阅来监听传入消息的函数。因此,当消息进入时,您的听众会拾取消息并显示它。 我写了一个要点here 关于如何在客户端中使用 actioncable(在 react-native 中)。在您的客户端中,您创建一个侦听传入消息的套接字。

    【讨论】:

    • 感谢您的回答,LordKiz。我使用 Android 作为我的客户端。因为我的查询是在频道广播消息时。因为这是两个用户第一次开始一起聊天,房间刚刚创建(数据库中不存在 room_id)并且它没有在服务器上流式传输。这意味着客户端没有订阅该流并且无法接收传入的消息。
    • 没错。如果客户端未订阅,则无法接收传入消息。当两个用户开始聊天时,您应该在数据库中创建一个带有 id 的房间。然后流到那个房间。
    • 那么在这种情况下,客户端需要发送重新订阅频道的请求,对吧?或者做些什么来流到服务器上的那个房间?我还是不知道怎么处理。
    • 是的。每次客户端打开该房间时,创建一个订阅频道的套接字。
    猜你喜欢
    • 1970-01-01
    • 2016-12-02
    • 2019-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多