web-dev-qa-db-fra.com

"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, pas quelque chose de simpliste comme ceux de cette question

41
Zabba

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.

24
ctide

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) }
84
Yuri Barbashov

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:

Comment savoir si un utilisateur est en ligne?

20
Ryan Epp

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.

1
mchapman17

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 .

0
Mohanraj