ruby-on-rails 接收所有当前用户ActionCable连接的最佳方式是什么?

bogh5gae  于 2023-03-20  发布在  Ruby
关注(0)|答案(3)|浏览(117)

我需要监视用户连接,并在用户关闭浏览器中的所有选项卡时将用户标记为脱机。
我想,我应该检查.unsubscribe方法中的用户连接数,并在连接数为零时将用户标记为离线。
但是如何接收当前用户的所有连接?或者什么是最好的方法来做到这一点?

cld4siwp

cld4siwp1#

Rails指南中有(一半)这样的示例:https://guides.rubyonrails.org/action_cable_overview.html#example-1-user-appearances
基本上,您创建了一个AppearanceChannel,每个用户都订阅了它,订阅将调用current_user的appearance函数,然后可以将其广播出去。

vjrehmav

vjrehmav2#

我目前的解决方案:
我的频道

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
kpbwa7wx

kpbwa7wx3#

我也有同样的问题要找到这个问题的正确答案。
我在这里和大家分享我在GoRails资源中找到的解决方案(https://github.com/gorails-screencasts/online-users-with-actioncable),希望能对大家有所帮助!
我的频道,它使用Redis来存储连接到这个特定频道的用户列表,我使用current_user作为我的connection.rb文件中的标识符:

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

希望这对一些人有帮助!

相关问题