ruby-on-rails-3 - hacer - devise roles
"Quién está en línea" usando Devise in Rails (5)
Usando Devise on Rails, ¿hay alguna manera de enumerar todos los usuarios que actualmente tienen sesiones activas, es decir, los usuarios que están actualmente conectados?
PD. Estoy buscando una solución sólida, no algo simplista como las de esta pregunta
Acabo de implementar otra versión de esto y pensé que lo compartiría en caso de que ayudara a alguien más.
Acabo de agregar una columna last_sign_out_at
a mi tabla Users y luego subclasé el controlador de sesiones de Devise para poder anular el método destroy para configurarlo cuando la sesión se destruye (el usuario last_sign_out_at
la sesión):
# app/controllers
class SessionsController < Devise::SessionsController
def destroy
current_user.update_attribute(:last_sign_out_at, Time.now)
super
end
end
Y luego en mi modelo de Usuario tengo un método para verificar si el usuario está en línea:
class User < ActiveRecord::Base
def online?
if current_sign_in_at.present?
last_sign_out_at.present? ? current_sign_in_at > last_sign_out_at : true
else
false
end
end
end
También debes decirle a Devise que use el nuevo controlador de Sesiones en tus rutas.
Podemos enumerar las sesiones activas actuales utilizando el almacén de sesión de registro activo. Mire la página de la aplicación github https://github.com/mohanraj-ramanujam/online-users .
Si le molesta hacer un viaje a la base de datos en cada uno. soltero. http solicitud. solo para tener una ventana pequeña donde se puede suponer que un usuario está en línea; Tengo una solución alternativa.
Al usar websockets y redis, es posible obtener de manera confiable el estado en línea de un usuario hasta en milisegundos sin hacer un millardo de costosas escrituras en el disco. Desafortunadamente, requiere un poco más de trabajo y tiene dos dependencias adicionales, pero si alguien está interesado, hice una escritura bastante detallada aquí:
Simplemente agregue after_filter en ApplicationController
after_filter :user_activity
private
def user_activity
current_user.try :touch
end
Luego, en el modelo de usuario, ¿agregar en línea? método
def online?
updated_at > 10.minutes.ago
end
También puedes crear alcance
scope :online, lambda{ where("updated_at > ?", 10.minutes.ago) }
https://github.com/ctide/devise_lastseenable
Puedes usar esta gema que escribí para almacenar la marca de tiempo ''last_seen'' de un usuario. A partir de ahí, es bastante trivial mostrar los usuarios que fueron vistos por última vez en los últimos 5 o 10 minutos.