ruby-on-rails - 如何向客户端广播消息而不订阅 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
但我想知道客户何时将消息发送给不在房间的新人。未创建流式传输。对方如何才能收到消息并继续进行对话?
解决方案
对于发送消息的用户,您可以在消息模型中创建一个回调,该回调会在创建消息时广播到您的频道。我假设您创建了正确的关联。即房间has_many
消息。依次发送消息belongs_to
Room
和User
类似这样的内容:
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 中)。在您的客户端中,您创建一个侦听传入消息的套接字。
推荐阅读
- c++ - C++ 从另一个 C++ 文件“导入”一个枚举类
- sql - 如何使用随机序列的 B 中的值更新填充 A 表中的空字段
- python - Python 在 exec() 之后找不到执行的函数
- firebase - 链接 Firebase Firestore 文档/集合
- ios - 如果 `MPSCNNConvolutionDataSource` 协议的 `load` 方法返回 false 会发生什么?
- hyperledger-fabric - 链码查询交易未在 EC2 Insance 中执行
- java - 哪个更适合使用,vector 或 arraylist?
- json - 如何将“node_modules”中的模式设置为“$schema”
- mysql - 如何将 HTML 格式的文本插入 MySQL?
- c - 数据结构学习中的函数调用问题