Я не могу 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, и пользователь, который нажимает на это, получит обновления, когда на этом посту произойдут какие-то действия. Но если вы обновите страницу, то это соединение не сможет повторно подключить этого пользователя к этому сообщению, поскольку в хэше нет параметров. Итак, мне интересно, как мне выйти из этого.
Кроме того, даже на странице руководств по направляющим показано это здесь. Таким образом, они передают параметры, но как вы поддерживаете соединение при перезагрузке страницы?
Итак, что я понимаю из вашего вопроса, вы хотите, чтобы пользователи были последователями этого сообщения, когда пользователь нажимает ссылку "подписаться". Для этого вам нужно будет сохранить эту информацию в базе данных, установив связь между пользователем и почтой как последователем. Затем всякий раз, когда на этом посту происходит какое-либо действие, транслируется уведомление в поток уведомлений всех последователей этого конкретного сообщения.
Создайте 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"