40 votes

"Qui est en ligne" en utilisant Devise dans 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 qui sont actuellement connectés ?

Ps. Je recherche une solution robuste, et non quelque chose de simpliste comme celles proposées dans cette question

84voto

Yuri Barbashov Points 559

Il suffit d'ajouter after_filter dans ApplicationController

after_filter :user_activity

private

def user_activity
  current_user.try :touch
end

Ensuite, dans le modèle utilisateur, ajoutez la méthode online ?

def online?
  updated_at > 10.minutes.ago
end

Vous pouvez également créer un champ d'application

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

24voto

ctide Points 2927

https://github.com/ctide/devise_lastseenable

Vous pouvez utiliser cette gemme que j'ai écrite pour stocker le timestamp 'last_seen' d'un utilisateur. À partir de là, il est assez simple d'afficher les utilisateurs qui ont été vus en dernier dans les 5 ou 10 dernières minutes.

20voto

Ryan Epp Points 209

Si cela vous ennuie de faire un voyage vers la base de données à chaque requête http, seulement pour avoir une petite fenêtre où vous pouvez supposer qu'un utilisateur est en ligne, j'ai une solution alternative.

À l'aide de websockets et de redis, il est possible d'obtenir de manière fiable le statut en ligne d'un utilisateur à la milliseconde près sans effectuer un milliard d'écritures coûteuses 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 un article assez détaillé ici :

Comment puis-je savoir si un utilisateur est en ligne ?

1voto

mchapman17 Points 28

Je viens de mettre en place une autre version de ce système et j'ai pensé que je devais la partager au cas où cela aiderait quelqu'un d'autre.

J'ajoute juste un last_sign_out_at à ma table Users, puis j'ai sous-classé le contrôleur de sessions Devise afin de pouvoir surcharger 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 ensuite, 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.

0voto

Mohanraj Points 1084

Nous pouvons dresser la liste des 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 .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X