如何与使用从客户端传递到服务器的参数用于ActionCable的通道保持连接?

时间:2018-10-16 10:44:25

标签: javascript ruby-on-rails actioncable

我不会动摇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锚标记,它将获得我在页面上拥有的HTML类帖子的值,然后将其用于订阅创建的params哈希中。这一切都很好,很花哨,单击该用户的用户将对该帖子进行某些操作时得到更新。但是,如果刷新页面,则该连接无法将该消费者重新连接到该帖子,因为哈希中没有参数。因此,我想知道如何摆脱这种情况。

即使在rails guides页面上,它也显示此here,所以他们正在传递参数,但是当页面重新加载时如何保持连接?

1 个答案:

答案 0 :(得分:1)

因此我从您的问题中了解到,当用户单击“订阅”链接时,您希望用户成为该帖子的关注者。为此,您将必须通过在User和Post作为Follower之间建立关联来将此信息存储在数据库中。 然后,只要该帖子发生活动,就向该帖子的所有关注者的通知流广播通知。

创建一个NotificationsChannel,每位用户登录到该站点时都将订阅该频道,例如,一个ID为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"