如何将消息发送给除 rails/actioncable 中的发件人之外的所有客户端?

Posted

技术标签:

【中文标题】如何将消息发送给除 rails/actioncable 中的发件人之外的所有客户端?【英文标题】:how to send message to all client except sender in rails/actioncable? 【发布时间】:2016-12-17 22:58:00 【问题描述】:

在 socket.io 中,您可以向除发送者以外的所有客户端发送消息,例如:

socket.broadcast.emit('user connected');

但是在 rails/actioncable 中,该怎么做呢?

class BoardChannel < ApplicationCable::Channel
   def subscribed
     stream_from "board:#params[:board]"
   end

   def speak
     # client will call @perform('speak')
     result = do_something()
     # how to send 'result' to all client except sender?
   end
 end

【问题讨论】:

在plezi.io 上,您可以使用#broadcast method 执行此操作,我认为Rails 会有类似的东西,可能称为publish...但我不确定。 这里的情况相同。在前端管理了一个解决方法,但我不喜欢这个解决方案。那里的每个示例(包括文档)都假定发送者应该收到他发送的事件。后端的另一种解决方法是传递发送方套接字 id、拉取客户端、删除发送方,然后使用循环手动向每个客户端广播。 您是否尝试过为每个用户使用不同的广播名称?像stream_from "board:#params[:board]:#user.id" 这样的东西。然后每个用户都会获得自己的流,您可以通过循环将其广播给应该接收它的特定用户。 从此没有解决方案? 【参考方案1】:

使用作业,您可以使用部分逻辑来完成此操作。 在您的模型中创建记录后,调用作业执行传递自我记录。 请参阅下文如何使用广播将消息传递给接收到的数据(在通道上)。

   ...  

   def perform(message)
     ActionCable.server.broadcast "board:#params[:board]",
     message: render_message(message)
   end

   private

   def 
     ApplicationController.renderer.render(
       partial: 'messages/message.html.erb',
       locals:  message: message 
     )
   end  

在views/messages/_message.html.erb 和你的代码中创建一个部分

 <%= if message.sender_id == current_user.id %>
   The code to report that forwarded message.
 <%= else %>
   The code to send the message to all except sender.
 <% end %>

【讨论】:

【参考方案2】:

我整个下午都在担心这个问题。一切准备放弃,刚躺在床上,脑子里闪过一个办法,它行得通! ! !登录分享

 class BoardChannel < ApplicationCable::Channel
   def subscribed
     stream_from "board:#params[:board]"
     stream_from "global_stream"
   end
 end

那么,当你想广播所有用户时,你可以:

ActionCable.server.broadcast "global_stream", "some messages"

当然,您也可以向特殊用户广播。你可以:

ActionCable.server.broadcast "board:#params[:board]", "some messages"

完美!!!

【讨论】:

以上是关于如何将消息发送给除 rails/actioncable 中的发件人之外的所有客户端?的主要内容,如果未能解决你的问题,请参考以下文章

在websocket上编写Oracle PL / SQL

如何将receiptid映射到smack中发送的消息

如何让机器人将消息发送到“通用”频道或消息最多的频道?

如何将消息发送给多个收件人

如何将消息从 QWidget 发送到 QStatusBar?

如何让机器人在收到来自某个消息的反应后将消息发送到特定频道