Rails: Woher kommt der berüchtigte "current_user"?

94

Ich habe mich kürzlich in Rails umgesehen und festgestellt, dass es viele Verweise auf gibt current_user. Kommt das nur von Devise? und muss ich es selbst manuell definieren, auch wenn ich Devise verwende? Gibt es Voraussetzungen für die Verwendung current_user(wie das Vorhandensein von Sitzungen, Benutzern usw.)?

Bigpotato
quelle

Antworten:

81

Es wird durch mehrere Edelsteine ​​definiert, z. B. Devise

Sie müssen die Benutzer-ID irgendwo speichern, normalerweise in der Sitzung nach dem Anmelden. Außerdem wird davon ausgegangen, dass Ihre App Benutzer, Authentifizierung usw. hat und benötigt.

Normalerweise ist es so etwas wie:

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

Dies setzt voraus, dass die Benutzerklasse existiert, z #{Rails.root}/app/models/user.rb.

Aktualisiert: Vermeiden Sie zusätzliche Datenbankabfragen, wenn kein aktueller Benutzer vorhanden ist.

Erik Peterson
quelle
ähneln Sitzungen einem häufig verwendeten Controller / Modell zur Steuerung des Anmeldestatus eines Benutzers? oder ist es in Schienen eingebaut?
Bigpotato
sessionist in Rails eingebaut. Standardmäßig wird ein Cookie verwendet, um den Status eines Clients zwischen Anforderungen aufrechtzuerhalten. Weitere Informationen finden Sie unter guide.rubyonrails.org/security.html#sessions .
Erik Peterson
2
HINWEIS: Wenn Sie diese Antwort lesen, stellen Sie sicher, dass Sie sie return unless session[:user_id]wie in Zachs Antwort angegeben if current_usereinfügen. Andernfalls löst jede Überprüfung beim Abmelden eine weitere Datenbankabfrage aus.
DreadPirateShawn
10

Ja, current_userverwendet session. Sie können in Ihrem Anwendungscontroller etwas Ähnliches tun, wenn Sie Ihre eigene Authentifizierung durchführen möchten:

def current_user
  return unless session[:user_id]
  @current_user ||= User.find(session[:user_id])
end
Zach Kemp
quelle
ähneln Sitzungen einem häufig verwendeten Controller / Modell zur Steuerung des Anmeldestatus eines Benutzers? oder ist es in Schienen eingebaut?
Bigpotato
1
sessionist so ähnlich params, außer dass es für mehrere Anfragen bestehen bleibt. Sie können damit alle Arten von persistenten Parametern speichern, die für Ihre einzelnen Benutzer eindeutig sind (bis ihre Sitzung abläuft oder sie sich abmelden). Sie können hier mehr darüber lesen: ActionController: Zugriff auf die Sitzung
Zach Kemp