使用 ActionCable,有没有办法计算频道内有多少订阅者?
With ActionCable, is there a way to count how many subscribers from inside a channel?
对于我正在构建的应用程序,我有一个 "lobby" 页面,人们可以在其中配置他们想加入的区域。很基础。
我想要 运行 当前订阅此页面频道的活跃消费者总数,以便用户知道周围是否有其他人可以与之互动。
有没有简单的方法来做到这一点?
是的,有一个:
在你的 app/channel/what_so_ever_you_called_it.rb:
class WhatSoEverYouCalledItChannel < ApplicationCable::Channel
def subscribed
stream_from "your_streamer_thingy"
@subscriber +=1 #<==== like this
end
def unsubscribed
# Any cleanup needed when channel is unsubscribed
@subscriber -=1 #<===== like this
end
def send_message(data)
your_message_mechanic
end
设置一个增加订阅的变量
并减少取消订阅。
您可能希望将值存储在您的 'lobby' 模型中,在这种情况下,'@subscriber' 可能被称为 @lobby.connected_total,我不知道,让它满足您的需要。
但这是一种跟踪流数量的方法。
开心
我定义了一个辅助方法:
app/channels/application_cable/channel.rb
module ApplicationCable
class Channel < ActionCable::Channel::Base
def connections_info
connections_array = []
connection.server.connections.each do |conn|
conn_hash = {}
conn_hash[:current_user] = conn.current_user
conn_hash[:subscriptions_identifiers] = conn.subscriptions.identifiers.map {|k| JSON.parse k}
connections_array << conn_hash
end
connections_array
end
end
end
现在您可以在派生频道内的任何地方调用 connections_info
。该方法 returns 一个关于所有可用服务器套接字连接、它们各自的 current_user
和它们所有当前订阅的信息数组。
这是我的数据示例connections_info
returns:
[1] pry(#<ChatChannel>)> connections_info
=> [{:current_user=>"D8pg2frw5db9PyHzE6Aj8LRf",
:subscriptions_identifiers=>
[{"channel"=>"ChatChannel",
"secret_chat_token"=>"f5a6722dfe04fc883b59922bc99aef4b5ac266af"},
{"channel"=>"AppearanceChannel"}]},
{:current_user=>
#<User id: 2, email: "client1@example.com", created_at: "2017-03-27 13:22:14", updated_at: "2017-04-28 11:13:37", provider: "email", uid: "client1@example.com", first_name: "John", active: nil, last_name: nil, middle_name: nil, email_public: nil, phone: nil, experience: nil, qualification: nil, price: nil, university: nil, faculty: nil, dob_issue: nil, work: nil, staff: nil, dob: nil, balance: nil, online: true>,
:subscriptions_identifiers=>
[{"channel"=>"ChatChannel",
"secret_chat_token"=>"f5a6722dfe04fc883b59922bc99aef4b5ac266af"}]}]
然后您可以按照自己的方式解析此结构并提取所需的数据。您可以通过相同的current_user
来区分您自己在该列表中的连接(current_user
方法在class Channel < ActionCable::Channel::Base
中可用)。
如果用户连接两次(或更多次),则对应的数组元素加倍。
对于我正在构建的应用程序,我有一个 "lobby" 页面,人们可以在其中配置他们想加入的区域。很基础。
我想要 运行 当前订阅此页面频道的活跃消费者总数,以便用户知道周围是否有其他人可以与之互动。
有没有简单的方法来做到这一点?
是的,有一个:
在你的 app/channel/what_so_ever_you_called_it.rb:
class WhatSoEverYouCalledItChannel < ApplicationCable::Channel
def subscribed
stream_from "your_streamer_thingy"
@subscriber +=1 #<==== like this
end
def unsubscribed
# Any cleanup needed when channel is unsubscribed
@subscriber -=1 #<===== like this
end
def send_message(data)
your_message_mechanic
end
设置一个增加订阅的变量 并减少取消订阅。
您可能希望将值存储在您的 'lobby' 模型中,在这种情况下,'@subscriber' 可能被称为 @lobby.connected_total,我不知道,让它满足您的需要。
但这是一种跟踪流数量的方法。
开心
我定义了一个辅助方法:
app/channels/application_cable/channel.rb
module ApplicationCable
class Channel < ActionCable::Channel::Base
def connections_info
connections_array = []
connection.server.connections.each do |conn|
conn_hash = {}
conn_hash[:current_user] = conn.current_user
conn_hash[:subscriptions_identifiers] = conn.subscriptions.identifiers.map {|k| JSON.parse k}
connections_array << conn_hash
end
connections_array
end
end
end
现在您可以在派生频道内的任何地方调用 connections_info
。该方法 returns 一个关于所有可用服务器套接字连接、它们各自的 current_user
和它们所有当前订阅的信息数组。
这是我的数据示例connections_info
returns:
[1] pry(#<ChatChannel>)> connections_info
=> [{:current_user=>"D8pg2frw5db9PyHzE6Aj8LRf",
:subscriptions_identifiers=>
[{"channel"=>"ChatChannel",
"secret_chat_token"=>"f5a6722dfe04fc883b59922bc99aef4b5ac266af"},
{"channel"=>"AppearanceChannel"}]},
{:current_user=>
#<User id: 2, email: "client1@example.com", created_at: "2017-03-27 13:22:14", updated_at: "2017-04-28 11:13:37", provider: "email", uid: "client1@example.com", first_name: "John", active: nil, last_name: nil, middle_name: nil, email_public: nil, phone: nil, experience: nil, qualification: nil, price: nil, university: nil, faculty: nil, dob_issue: nil, work: nil, staff: nil, dob: nil, balance: nil, online: true>,
:subscriptions_identifiers=>
[{"channel"=>"ChatChannel",
"secret_chat_token"=>"f5a6722dfe04fc883b59922bc99aef4b5ac266af"}]}]
然后您可以按照自己的方式解析此结构并提取所需的数据。您可以通过相同的current_user
来区分您自己在该列表中的连接(current_user
方法在class Channel < ActionCable::Channel::Base
中可用)。
如果用户连接两次(或更多次),则对应的数组元素加倍。