Как сохранить соединение с каналом, который использует параметры, передаваемые от клиента к серверу для ActionCable? - PullRequest
0 голосов
/ 16 октября 2018

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

class PostNotificationsChannel < ApplicationCable::Channel

  def subscribed
    stream_from params[:post_id]
  end

  def unsubscribed
    stop_all_streams
  end
end

Тогда у меня есть js

/ javascripts / channel / post_notifications.js

$(document).on('turbolinks:load', function() {
  $("a.post_subscribe").click(function subscribeToPost() {
  var post_id = $(this).parents("li").attr("class").split(" ")[0]; // Get the post id off the page
  App.post_notifications = App.cable.subscriptions.create({channel: "PostNotificationsChannel", post_id: post_id}, {

    connected: function() {},

    disconnected: function() {},

    received: function(data) {}
    });
  });
});

Таким образом, вы нажимаете на тег привязки .post_subscribe, и он получает значение того HTML-класса сообщений, который есть у меня на странице, а затем используется вхэш параметров создания подписки.Это все прекрасно, и пользователь, который нажимает на это, получит обновления, когда какое-то действие произойдет с этим сообщением.Но если вы обновите страницу, то это соединение не сможет повторно соединить этого потребителя с этим сообщением, поскольку в хэше нет параметров.Итак, мне интересно, как мне выйти из этого.

Кроме того, даже на странице направляющих рельсов показано это здесь Так что они передают параметры, но как вы сохраняете соединениекогда страница перезагрузится?

1 Ответ

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

Итак, насколько я понимаю из вашего вопроса, вы хотите, чтобы пользователи следили за этим постом, когда пользователь нажимает на ссылку «подписаться».Для этого вам нужно будет сохранить эту информацию в базе данных, связав ее между пользователем и постом в качестве подписчика.Затем всякий раз, когда в этом посте происходит какое-либо действие, отправляйте в поток уведомлений всех подписчиков этого конкретного поста уведомление.

Создайте канал уведомлений, на который будет подписываться каждый пользователь всякий раз, когда он входит на сайт,так, например, пользователь с идентификатором 1, войдя в систему, он будет подписан на поток уведомлений, который будет уникальным для каждого пользователя, например, notify_user_1_channel

class NotificationsChannel < ApplicationCable::Channel
  def subscribed
    if params[:recepient].present?
      stream_from "notify_#{params[:recepient]}_channel"
    end
  end

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

В вашем сценарии для канала

App.chat = App.cable.subscriptions.create {
            channel: "NotificationsChannel"
            recepient: $('#recepient').data("recepient")
            }

И для предоставления получателя в качестве параметра, где-то в коде представления, предпочтительно в нижнем колонтитуле,

<div id="recepient" data-recepient="User_<%= current_user.id %>"></div>

И, для передачи уведомления потоку, в after_create_commit модели уведомлений,

ActionCable.server.broadcast "notify_#{notification.recepient_type}_#{notification.recepient_id}_channel"
...