"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

40
demandé sur Community 2011-03-31 21:52:07

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.

24
répondu ctide 2011-03-31 17:56:56

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) }
84
répondu Yuri Barbashov 2011-12-15 10:43:17

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:

Comment savoir si un utilisateur est en ligne?

19
répondu Ryan Epp 2014-01-28 04:21:53

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.

1
répondu mchapman17 2013-02-01 09:06:02

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 .

0
répondu Mohanraj 2013-07-15 04:57:43