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

xla*_*aok 9 ruby ruby-on-rails websocket actioncable

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

socket.broadcast.emit('user connected');
Run Code Online (Sandbox Code Playgroud)

但在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
Run Code Online (Sandbox Code Playgroud)

Léo*_*cha 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  
Run Code Online (Sandbox Code Playgroud)

在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 %>
Run Code Online (Sandbox Code Playgroud)