首页 > 解决方案 > 如何向客户端广播消息而不订阅 Action Cable 中的主题

问题描述

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

当客户端登录到应用程序时,我发送消息订阅频道。通道将基于current_user's进行连接流式传输room_id。当用户发送消息时,它将发送给所有订阅频道的人 这是正常的行动电缆流程。

这是我的频道:

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

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

标签: ruby-on-railsactioncable

解决方案


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

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

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


推荐阅读