Как сохранить соединение с каналом, который использует параметры, передаваемые от клиента к серверу для ActionCable?

1

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

class PostNotificationsChannel < ApplicationCable::Channel

  def subscribed
    stream_from params[:post_id]
  end

  def unsubscribed
    stop_all_streams
  end
end

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

/javascripts/channels/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 привязки .post_subscribe и получаете значение этого класса HTML- .post_subscribe которое у меня есть на странице, а затем используйте его в параметре hash создания подписки. Это все прекрасно и dandy, и пользователь, который нажимает на это, получит обновления, когда на этом посту произойдут какие-то действия. Но если вы обновите страницу, то это соединение не сможет повторно подключить этого пользователя к этому сообщению, поскольку в хэше нет параметров. Итак, мне интересно, как мне выйти из этого.

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

Теги:
actioncable

1 ответ

1
Лучший ответ

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

Создайте NotificationChannel, к которому каждый пользователь будет подписаться, когда он войдет на сайт, так например, пользователь с идентификатором 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"
  • 0
    конечно, держите меня в курсе, если вы найдете другой способ. Так что я должен попробовать это в моем следующем проекте.
  • 0
    Я не думаю, что есть другой способ, похоже, именно так работает кабель действий. Спасибо за ясность!
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню