ActionCable 显示正确的连接用户数(问题:多个选项卡、断开连接)

ActionCable display correct number of connected users (problems: multiple tabs, disconnects)

我是 Rails 构建测验网络应用程序的初学者。目前我正在使用 ActionCable.server.connections.length 来显示有多少人连接到我的测验,但存在多个问题:

  1. 当页面重新加载一半时ActionCable 没有正确断开旧连接,所以数字一直在上升,尽管它不应该
  2. 它只为您提供在中调用的特定线程的当前连接数,正如@edwardmp在中指出的那样(这也意味着,为测验主持人(我的应用程序中的一种类型的用户)显示的连接数可能与向测验参与者显示的连接数不同)
  3. 当用户连接 多个浏览器时 windows 每个连接都单独计算 这会错误地夸大参与者的数量
  4. 最后但同样重要的是:如果能够显示我频道的每个房间连接的人数,而不是所有房间
  5. ,那就太好了]

我注意到有关此主题的大多数答案都使用 Redis 服务器,所以我想知道是否通常建议将其用于我正在尝试做的事情以及为什么。 (例如这里:

我目前使用 Devise 和 cookie 进行身份验证。

任何对我的部分问题的指示或回答都将不胜感激:)

我终于至少可以通过这样做来计算服务器的所有用户(而不是按房间):

我频道的CoffeeScript:

App.online_status = App.cable.subscriptions.create "OnlineStatusChannel",
  connected: ->
    # Called when the subscription is ready for use on the server
    #update counter whenever a connection is established
    App.online_status.update_students_counter()

  disconnected: ->
    # Called when the subscription has been terminated by the server
    App.cable.subscriptions.remove(this)
    @perform 'unsubscribed'

  received: (data) ->
    # Called when there's incoming data on the websocket for this channel
    val = data.counter-1 #-1 since the user who calls this method is also counted, but we only want to count other users
    #update "students_counter"-element in view:
    $('#students_counter').text(val)

  update_students_counter: ->
    @perform 'update_students_counter'

Ruby 我频道的后端:

class OnlineStatusChannel < ApplicationCable::Channel
  def subscribed
    #stream_from "specific_channel"
  end

  def unsubscribed
    # Any cleanup needed when channel is unsubscribed
    #update counter whenever a connection closes
    ActionCable.server.broadcast(specific_channel, counter: count_unique_connections )
  end

  def update_students_counter
    ActionCable.server.broadcast(specific_channel, counter: count_unique_connections )
  end

  private:
  #Counts all users connected to the ActionCable server
  def count_unique_connections
    connected_users = []
    ActionCable.server.connections.each do |connection|
      connected_users.push(connection.current_user.id)
    end
    return connected_users.uniq.length
  end
end

现在可以了!当用户连接时,计数器递增,当用户关闭他的 window 或注销时,计数器递减。当用户使用多个选项卡或 window 登录时,他们只被计算一次。 :)