class MyChannel < ApplicationCable::Channel
def subscribed
make_user_online
end
def unsubscribed
make_user_offline
end
private
def make_user_online
current_user.increment_connections_count
current_user.online!
end
def make_user_offline
return unless current_user.decrement_connections_count.zero?
current_user.offline!
end
end
user.rb
class User < ApplicationRecord
def connections_count
Redis.current.get(connections_count_key).to_i
end
def increment_connections_count
val = Redis.current.incr(connections_count_key)
Redis.current.expire(connections_count_key, 60 * 60 * 24)
val
end
def decrement_connections_count
return 0 if connections_count < 1
Redis.current.decr(connections_count_key)
end
private
def connections_count_key
"user:#{id}:connections_count"
end
end
class xxxChannel < ApplicationCable::Channel
def subscribed
add_to_active_users_on_xxx
stream_from "something_#{params[:xxx_id]}"
end
def unsubscribed
remove_from_active_users_on_xxx
end
private
def add_to_active_users_on_xxx
ActionCable.server.pubsub.redis_connection_for_subscriptions.sadd(
"active_on_xxx_#{params[:xxx_id]}",
current_user.id
)
end
def remove_from_active_users_on_xxx
ActionCable.server.pubsub.redis_connection_for_subscriptions.srem(
"active_on_xxx_#{params[:xxx_id]}",
current_user.id
)
end
end
在我的用户模型中,我可以调用这个方法来检索特定通道上的所有连接用户:
def self.active_on_xxx(xxx_id)
user_ids = ActionCable.server.pubsub.redis_connection_for_subscriptions.smembers("active_on_xxx_#{xxx_id}")
where(id: user_ids)
end
3条答案
按热度按时间cld4siwp1#
Rails指南中有(一半)这样的示例:https://guides.rubyonrails.org/action_cable_overview.html#example-1-user-appearances
基本上,您创建了一个AppearanceChannel,每个用户都订阅了它,订阅将调用current_user的appearance函数,然后可以将其广播出去。
vjrehmav2#
我目前的解决方案:
我的频道
user.rb
kpbwa7wx3#
我也有同样的问题要找到这个问题的正确答案。
我在这里和大家分享我在GoRails资源中找到的解决方案(https://github.com/gorails-screencasts/online-users-with-actioncable),希望能对大家有所帮助!
我的频道,它使用Redis来存储连接到这个特定频道的用户列表,我使用current_user作为我的
connection.rb
文件中的标识符:在我的用户模型中,我可以调用这个方法来检索特定通道上的所有连接用户:
希望这对一些人有帮助!