"Who's Online" à L'aide de la Devise dans les Rails
grâce à L'utilisation de Devise sur Rails, y a-t-il un moyen de lister tous les utilisateurs qui ont actuellement des sessions actives, c'est-à-dire les utilisateurs qui sont actuellement connectés?
Ps. Je cherche une solution robuste, pas quelque chose de simpliste comme ceux dans cette question
5 réponses
https://github.com/ctide/devise_lastseenable
vous pouvez utiliser cette pierre précieuse que j'ai écrite pour stocker l'horodatage 'last_seen' d'un utilisateur. De là, il est assez trivial d'afficher les utilisateurs qui ont été last_seen dans les 5 ou 10 dernières minutes.
il suffit D'ajouter after_filter dans ApplicationController
after_filter :user_activity
private
def user_activity
current_user.try :touch
end
puis dans le modèle Utilisateur ajouter en ligne? méthode
def online?
updated_at > 10.minutes.ago
end
aussi u peut créer la portée
scope :online, lambda{ where("updated_at > ?", 10.minutes.ago) }
si vous êtes gêné en faisant un voyage à la base de données sur chaque. seul. http. demande. uniquement pour certains petite fenêtre dans laquelle vous pouvez sorte de supposer qu'un utilisateur est en ligne, j'ai une autre solution.
en utilisant websockets et redis il est possible d'obtenir de manière fiable le statut en ligne d'un utilisateur jusqu'à la milliseconde sans faire un milliard d'Écritures coûteuses sur le disque. Malheureusement, il nécessite un bon peu plus de travail et a deux dépendances supplémentaires, mais si quelqu'un est intéressé J'ai fait une écriture assez détaillée ici:
je viens d'implémenter une autre version de ceci et j'ai pensé partager au cas où cela aiderait quelqu'un d'autre.
je viens d'ajouter une colonne last_sign_out_at
à ma table D'utilisateurs et puis j'AI sous-classé le contrôleur des sessions de Devise pour que je puisse outrepasser la méthode de destroy pour la définir quand la session est détruite (l'utilisateur signe dehors):
# app/controllers
class SessionsController < Devise::SessionsController
def destroy
current_user.update_attribute(:last_sign_out_at, Time.now)
super
end
end
Et puis dans mon modèle, j'ai une méthode pour vérifier si l'utilisateur est en ligne:
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
Vous devez aussi dire à Devise D'utiliser le nouveau contrôleur de Sessions dans vos routes.
nous pouvons lister les sessions actives actuelles en utilisant le magasin de session active record. S'il vous plaît regarder la page de l'application github https://github.com/mohanraj-ramanujam/online-users .