2016-05-18 4 views
1

Я аутентификация пользователей в ActionCable так:Actioncable подключен список пользователей

module ApplicationCable 
    class Connection < ActionCable::Connection::Base 
    identified_by :current_user 

    def connect 
     self.current_user = find_verified_user 
     logger.add_tags 'ActionCable', current_user.name 
    end 

    protected 
     def find_verified_user 
     if verified_user = User.find_by(id: cookies.signed[:user_id]) 
      verified_user 
     else 
      reject_unauthorized_connection 
     end 
     end 
    end 
end 

Можно ли получить связный список пользователей? Я искал googled, но нашел только этот вопрос в stackoverflow: first, second

ответ

6

Мне нравится катать ваше собственное отслеживание пользователей.

важные биты следующим образом:

# connection 
module ApplicationCable 
    class Connection < ActionCable::Connection::Base 
    identified_by :uid 

    def connect 
     self.uid = get_connecting_uid 
     logger.add_tags 'ActionCable', uid 
    end 

    protected 

    # the connection URL to this actioncable/channel must be 
    # domain.tld?uid=the_uid 
    def get_connecting_uid 
     # this is just how I get the user id, you can keep using cookies, 
     # but because this key gets used for redis, I'd 
     # identify_by the user_id instead of the current_user object 
     request.params[:uid] 
    end 
    end 
end 


# Your Channel 
def subscribed 
    stop_all_streams 
    stream_from broadcasting_name 
    ConnectedList.add(uid) 
end 

def unsubscribed 
    ConnectedList.remove(uid) 
end 

А потом в моделях:

class ConnectedList 
    REDIS_KEY = 'connected_nodes' 

    def self.redis 
    @redis ||= ::Redis.new(url: ActionCableConfig[:url]) 
    end 

    # I think this is the method you want. 
    def self.all 
    redis.smembers(REDIS_KEY) 
    end 

    def self.clear_all 
    redis.del(REDIS_KEY) 
    end 

    def self.add(uid) 
    redis.sadd(REDIS_KEY, uid) 
    end 

    def self.include?(uid) 
    redis.sismember(REDIS_KEY, uid) 
    end 

    def self.remove(uid) 
    redis.srem(REDIS_KEY, uid) 
    end 
end 

от: https://github.com/NullVoxPopuli/mesh-relay/

+0

кажется, что при перезапуске сервера кабеля Действие, connected_nodes не будет сброс. Любое обходное решение для этого? – cisolarix

+0

может добавить инициализатор, который очищает redis cache connected_nodes? – NullVoxPopuli

+1

Я считаю, что это также провалится, когда конкретный пользователь подключится к нескольким окнам браузера. Когда пользователь закрывает одно окно, они будут удалены из ConnectedList (поскольку список пользователей отслеживается с помощью набора), хотя они все еще подключены из другого окна. – odonnellt

Смежные вопросы