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

时间:2016-08-11 09:26:04

标签: ruby-on-rails ruby websocket actioncable

在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

2 个答案:

答案 0 :(得分:1)

我整个下午都在担心这个问题。所有人都准备放弃,只是躺在床上,我的脑海里闪现了一个行之有效的解决方案! ! !登录以分享

 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"

完美!!!

答案 1 :(得分:0)

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

   ...  

   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 %>