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.