«Qui est en ligne» en utilisant Devise in Rails

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 actuellement connectés?

Ps. Je cherche une solution robuste, pas quelque chose de simpliste comme ceux de cette question

https://github.com/ctide/devise_lastseenable

Vous pouvez utiliser ce joyau que j’ai écrit pour stocker l’horodatage ‘last_seen’ d’un utilisateur. De là, il est assez sortingvial d’afficher les utilisateurs qui ont été last_seen dans les 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 

Ensuite, dans le modèle utilisateur, ajoutez en ligne? méthode

 def online? updated_at > 10.minutes.ago end 

Aussi, vous pouvez créer une scope

 scope :online, lambda{ where("updated_at > ?", 10.minutes.ago) } 

Si vous êtes dérangé par un voyage à la firebase database sur tous les. unique. 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 les Websockets et les redis, il est possible d’obtenir de manière fiable le statut en ligne d’un utilisateur jusqu’à la milliseconde sans que des milliards d’écritures coûteuses soient effectuées sur le disque. Malheureusement, cela demande un peu plus de travail et a deux dépendances supplémentaires, mais si quelqu’un est intéressé, j’ai écrit ici:

Comment savoir si un utilisateur est en ligne?

Je viens de mettre en œuvre une autre version de ce document et pensais que je partagerais au cas où cela aiderait quelqu’un d’autre.

Je viens d’append une colonne last_sign_out_at à ma table Users puis de sous-classer 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 (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 indiquer à Devise d'utiliser le nouveau contrôleur Sessions dans vos itinéraires.

Nous pouvons répertorier les sessions actives actuelles à l’aide du magasin de sessions d’enregistrement actif. S’il vous plaît regardez la page de l’application github https://github.com/mohanraj-ramanujam/online-users .