как отправить сообщение всем клиентам, кроме отправителя в rails/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

person xlaok    schedule 11.08.2016    source источник
comment
На plezi.io это можно сделать с помощью #broadcast method Я предполагаю, что в Rails будет что-то подобное, вероятно, под названием publish... но я не уверен.   -  person Myst    schedule 11.09.2016
comment
Здесь тот же случай. Удалось найти обходной путь во внешнем интерфейсе, но мне не нравится решение. Каждый пример (включая документацию) предполагает, что отправитель должен получить отправленное им событие. Другим обходным решением в бэкэнде является передача идентификатора сокета отправителя, извлечение клиентов, удаление отправителя, а затем ручная трансляция каждому клиенту с использованием цикла.   -  person kinduff    schedule 03.11.2016
comment
Пробовали ли вы использовать разные широковещательные имена для каждого отдельного пользователя? Что-то вроде stream_from "board:#{params[:board]}:#{user.id}". Затем каждый пользователь получает свой собственный поток, который вы можете транслировать по циклу только тем пользователям, которые должны его получать.   -  person brainbag    schedule 17.11.2017
comment
нет решения с тех пор?   -  person Matrix    schedule 15.02.2018


Ответы (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"

Идеальный!!!

person active_liang    schedule 07.03.2020

Используя задания, вы можете сделать это с помощью частичной логики.
В вашей модели после создания записи вызовите задание, выполняющее передачу собственной записи. Ниже показано, как передать сообщение полученным данным (на канале) с помощью широковещательной рассылки.

   ...  

   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 %>
person Léo Rocha    schedule 22.03.2018