ActionCable -如何显示连接的用户数量



我试图创建一个简单的聊天类应用程序(规划扑克应用程序)与行动电缆。我对术语、文件层次结构和回调如何工作有点困惑。

这是创建用户会话的操作:

class SessionsController < ApplicationController
  def create
    cookies.signed[:username] = params[:session][:username]
    redirect_to votes_path
  end
end

一个用户可以发布一个投票,应该广播给所有人:

class VotesController < ApplicationController
  def create
    ActionCable.server.broadcast 'poker',
                                 vote: params[:vote][:body],
                                 username: cookies.signed[:username]
    head :ok
  end
end

到目前为止,一切对我来说都很清楚,工作得很好。问题是-我如何显示连接用户的数量?当用户(消费者?)连接时,是否有一个回调函数在JS中触发?我想要的是当我在3个不同的浏览器中以隐身模式打开3个选项卡时,我想显示"3"。当一个新用户连接时,我希望这个数字增加。如果任何用户断开连接,该数字将递减。

My PokerChannel:

class PokerChannel < ApplicationCable::Channel
  def subscribed
    stream_from 'poker'
  end
end

app/assets/javascripts/poker.coffee:

App.poker = App.cable.subscriptions.create 'PokerChannel',
  received: (data) ->
    $('#votes').append @renderMessage(data)
  renderMessage: (data) ->
    "<p><b>[#{data.username}]:</b> #{data.vote}</p>"

似乎有一种方法是使用

ActionCable.server.connections.length

(见注释中的警告)

对于一个快速的(可能不是理想的)解决方案,你可以编写一个模块来跟踪订阅计数(使用Redis存储数据):

#app/lib/subscriber_tracker.rb
module SubscriberTracker
  #add a subscriber to a Chat rooms channel 
  def self.add_sub(room)
    count = sub_count(room)
    $redis.set(room, count + 1)
  end
  def self.remove_sub(room)
    count = sub_count(room)
    if count == 1
      $redis.del(room)
    else
      $redis.set(room, count - 1)
    end
  end
  def self.sub_count(room)
    $redis.get(room).to_i
  end
end

并更新频道类中的订阅和取消订阅方法:

class ChatRoomsChannel < ApplicationCable::Channel  
  def subscribed
     SubscriberTracker.add_sub params['room_id']
  end
  def unsubscribed
     SubscriberTracker.remove_sub params['chat_room_id'] 
  end
end

在谁是连接的相关问题中,对于那些使用redis的人有一个答案:

Redis.new.pubsub("channels", "action_cable/*")

如果你只想要连接数:

Redis.new.pubsub("NUMPAT", "action_cable/*")

这将汇总来自所有服务器的连接。

RemoteConnections类和InternalChannel模块中包含的所有魔法。

TL;DR在特殊通道上订阅的所有连接,其前缀为action_cable/*,仅用于从主rails应用程序断开套接字。

我想我为你找到了答案。试试这个:

ActionCable.server.connections.select { |con| con.current_room == room }.length?

我可以在代码中的任何地方使用它,并检查所选流的连接用户数量:)

在我的connection.rb我有这样的东西:

module ApplicationCable
  class Connection < ActionCable::Connection::Base
    identified_by :current_room
    def connect
      self.current_room = find_room
    end
    private
    def find_room
      .....
    end
  end
end

希望对大家有所帮助

With

ActionCable.server.pubsub.send(:listener).instance_variable_get("@subscribers")

可以获得键中包含订阅标识符的map和将在广播中执行的过程数组。

相关内容

  • 没有找到相关文章

最新更新