En utilisant Devise on Rails, existe-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 recherche une solution robuste, pas quelque chose de simpliste comme ceux de cette question
https://github.com/ctide/devise_lastseenable
Vous pouvez utiliser cette gemme que j'ai écrite pour stocker l'horodatage 'last_seen' d'un utilisateur. À partir de là, il est assez trivial d'afficher les utilisateurs qui ont été vus en dernier au cours des 5 ou 10 dernières minutes.
Ajoutez simplement 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
Vous pouvez également créer une portée
scope :online, lambda{ where("updated_at > ?", 10.minutes.ago) }
Si vous êtes dérangé par un voyage vers la base de données sur chaque. Célibataire. http. demande. seulement pour avoir une petite fenêtre où vous pouvez en quelque sorte supposer qu'un utilisateur est en ligne; J'ai une solution alternative.
En utilisant des websockets et des redis, il est possible d'obtenir de manière fiable l'état en ligne d'un utilisateur jusqu'à la milliseconde sans effectuer un milliard d'écritures coûteuses sur le disque. Malheureusement, cela nécessite un 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 de mettre en œuvre une autre version de ceci et j'ai pensé partager au cas où cela aiderait quelqu'un d'autre.
Je viens d'ajouter un last_sign_out_at
dans ma table Users, puis sous-classifié le contrôleur de sessions Devise afin que je puisse remplacer la méthode destroy pour la définir lorsque la session est détruite (l'utilisateur se déconnecte):
# 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 d'utilisateur, 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 également dire à Devise d'utiliser le nouveau contrôleur de sessions dans vos itinéraires.
Nous pouvons lister les sessions actives actuelles en utilisant le magasin de sessions d'enregistrement actif. Veuillez consulter la page de l'application github https://github.com/mohanraj-ramanujam/online-users .