ActionCable broadcast_to не достигает пользователя - PullRequest
0 голосов
/ 09 октября 2018

У меня есть базовая настройка с rails + devise + actioncable.

Я в основном хочу отправлять уведомления напрямую и конфиденциально вошедшему в систему пользователю.Мой код выглядит следующим образом:

connection.rb

module ApplicationCable
  class Connection < ActionCable::Connection::Base
    identified_by :current_user

    def connect
      self.current_user = find_verified_user
      logger.add_tags 'ActionCable', current_user.email
    end

    private

    def find_verified_user
      if verified_user = env['warden'].user
        verified_user
      else
        reject_unauthorized_connection
      end
    end
  end
end

notifications_channel.rb

class NotificationsChannel < ApplicationCable::Channel
  def subscribed
    stream_from current_user
  end
end

И все это прекрасно работает.Клиент подключен, и я могу видеть в журналах, что он правильно вошел в систему. Кроме того, я вижу следующий ввод в консоли rails:

[ActionCable] [admin@example.com] Registered connection (Z2lkOi8vcHJpc21vL1VzZXIvMQ)
[ActionCable] [admin@example.com] NotificationsChannel is transmitting the subscription confirmation
[ActionCable] [admin@example.com] NotificationsChannel is streaming from #<User:0x00007f87f4180b68>

Однако, при попытке отправить уведомление этому пользователю, используякод ниже, кажется, что событие не доходит до пользователя (без ошибок!):

2.5.1 :010 > NotificationsChannel.broadcast_to(User.first, test: 'foo')
[ActionCable] Broadcasting to notifications:Z2lkOi8vcHJpc21vL1VzZXIvMQ: {:test=>"pass"}
 => nil

И мой потребитель javascript ничего не записывает:

let cable = ActionCable.createConsumer(`ws://mydomain.com/cable`)

let actions = {
  received(payload) {
    console.log(payload) // <== this line logs nothing!
  }
}

cable.subscriptions.create('NotificationsChannel', actions)

Я сделал что-то не так?здесь?

1 Ответ

0 голосов
/ 09 октября 2018

Скорее всего, вы используете stream_from вместо stream_for.При ссылке на объект (модель), а не на строку в вашем канале, вы должны использовать stream_for.Попробуйте сделать это в notifications_channel.rb:

class NotificationsChannel < ApplicationCable::Channel
  def subscribed
    stream_for current_user
  end
end

Вот ссылка на документацию: https://api.rubyonrails.org/classes/ActionCable/Channel/Streams.html#method-i-stream_for

...