Rails: d'où vient le tristement célèbre "current_user"?

94

J'ai récemment cherché dans Rails et j'ai remarqué qu'il y avait beaucoup de références à current_user. Cela vient-il uniquement de Devise? et dois-je le définir manuellement moi-même même si j'utilise Devise? Y a-t-il des prérequis à l'utilisation current_user(comme l'existence de sessions, d'utilisateurs, etc.)?

grosse Pomme de terre
la source

Réponses:

81

Il est défini par plusieurs gemmes, par exemple Devise

Vous devrez stocker le user_id quelque part, généralement dans la session après la connexion. Cela suppose également que votre application a et a besoin d'utilisateurs, d'authentification, etc.

En règle générale, c'est quelque chose comme:

class ApplicationController < ActionController::Base
  def current_user
    return unless session[:user_id]
    @current_user ||= User.find(session[:user_id])
  end
end

Cela suppose que la classe User existe, par exemple #{Rails.root}/app/models/user.rb.

Mise à jour: évitez les requêtes de base de données supplémentaires lorsqu'il n'y a pas d'utilisateur actuel.

Erik Peterson
la source
les sessions sont-elles un peu comme un contrôleur / modèle couramment utilisé dans le but de contrôler l'état de connexion d'un utilisateur? ou est-il intégré aux rails?
bigpotato
sessionest intégré à Rails. Par défaut, il utilise un cookie pour maintenir l'état d'un client entre les demandes. Voir guides.rubyonrails.org/security.html#sessions pour plus d'informations.
Erik Peterson
2
REMARQUE: Si vous lisez cette réponse, assurez-vous de l'inclure return unless session[:user_id]comme indiqué dans la réponse de Zach - sans cela, chaque if current_uservérification en étant déconnecté déclenchera une autre requête de base de données.
DreadPirateShawn
10

Oui, current_userutilise session. Vous pouvez faire quelque chose de similaire dans votre contrôleur d'application si vous souhaitez lancer votre propre authentification:

def current_user
  return unless session[:user_id]
  @current_user ||= User.find(session[:user_id])
end
Zach Kemp
la source
les sessions sont-elles un peu comme un contrôleur / modèle couramment utilisé dans le but de contrôler l'état de connexion d'un utilisateur? ou est-il intégré aux rails?
bigpotato
1
sessionest un peu comme params, sauf qu'il persiste pour plusieurs demandes. Vous pouvez l'utiliser pour stocker toute sorte de paramètre persistant unique à vos utilisateurs individuels (jusqu'à ce que leur session expire ou qu'ils se déconnectent). Vous pouvez en savoir plus ici: ActionController: Accéder à la session
Zach Kemp