Как вы транслируете широковещательную рассылку конкретному пользователю в Rails 5 с помощью ActionCable? - PullRequest
0 голосов
/ 27 ноября 2018

В моем приложении 2 типа пользователей (работник и компания).Оба типа пользователей создаются с помощью Devise.В настоящее время я пытаюсь отправить уведомление определенной компании с помощью ActionCable.

Моя главная проблема заключается в том, что при отправке уведомления каждая подписавшаяся компания получает его.Я понял, что должен каким-то образом включить идентификатор компании в название потока, но пока мне не повезло.

Я включил рабочий код, который отправляет уведомления всем компаниямниже:

notifications_channel.rb

class NotificationsChannel < ApplicationCable::Channel
  def subscribed
    stream_from "notifications_channel"
  end

  def unsubscribed
    # Any cleanup needed when channel is unsubscribed
  end
end

connection.rb

module ApplicationCable
  class Connection < ActionCable::Connection::Base
  end
end

Позвонить на номершироковещательная рассылка

ActionCable.server.broadcast 'notifications_channel', { 'My data' }

РЕДАКТИРОВАТЬ

Я регистрирую статус уведомления с помощью javascript:

notifications.js

App.notifications = App.cable.subscriptions.create("NotificationsChannel", {
  connected: function() {
    console.log("connected");
  };

  disconnected: function() {
    console.log("disconnected");
  };

  received: function(data) {
    console.log("recieved");
  };
});

Ответы [ 2 ]

0 голосов
/ 27 ноября 2018

Мне удалось найти решение.После ответа Абхилаша я прошел большую часть пути, но у меня все еще были проблемы с аутентификацией компании.Похоже, Warden не был полностью настроен, поэтому этот пост заставил его работать: env ['warden'] не работает с Rails 5

0 голосов
/ 27 ноября 2018

Передайте сообщение от вашего контроллера следующим образом:

# Broadcast your message
ActionCable.server.broadcast "notifications_channel:#{target_user.id}

Теперь обновите app/channels/application_cable/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.name
    end

    protected

    def find_verified_user
      verified_user = User.find_by(id: cookies.signed['user.id'])
      if verified_user && cookies.signed['user.expires_at'] > Time.now
        verified_user
      else
        reject_unauthorized_connection
      end
    end
  end
end

И подпишитесь на поток следующим образом:

def subscribed
  stream_from "notifications_channel:#{current_user.id}"
end

Примечание. Это просто пример, показывающий, как настроить таргетинг на конкретного пользователя в Actioncable.Возможно, вам придется изменить код в зависимости от ваших требований.

Я также рекомендую посмотреть это видео от GoRails.

...