Nachdem wir Kapitel 8 des Rails-Tutorials abgeschlossen haben, werde ich über Session als Ausgabe posten.
Das dem Internet zugrunde liegende Protokoll "HTTP" ist "zustandslos". Da es buchstäblich keinen "Status" gibt, erbt jede "HTTP-Anforderung" nicht die Informationen der vorherigen Anforderung. Es ist leicht zu verstehen, wenn man sich das folgende Beispiel ansieht.
"Stateful Beispiel" Kunde: Hallo Angestellter: Willkommen. Willkommen bei XX Burger Kunde: Ich hätte gerne ein Hamburger-Set Angestellter: Was möchten Sie für das Seitenmenü? Kunde: Mit Kartoffeln Angestellter: Was möchten Sie trinken? Kunde: Bei Ginger Ale Angestellter: Wie wäre es mit einem Getränk der Größe L für +50 Yen? Kunde: M geht es gut Angestellter: Sind Sie sicher, dass Sie das tun möchten? Kunde: Ja Angestellter: Ich bin schlau
"Staatenloses Beispiel" Kunde: Hallo Angestellter: Willkommen. Willkommen bei XX Burger Kunde: Ich hätte gerne ein Hamburger-Set Angestellter: Was möchten Sie für das Seitenmenü? Kunde: Bitte geben Sie mir ein Hamburger-Set mit Kartoffeln Angestellter: Was möchten Sie trinken? Kunde: Bitte geben Sie mir ein Hamburger-Set mit Kartoffeln und Ginger Ale Angestellter: Wie wäre es mit einem Getränk der Größe L für +50 Yen? Kunde: Bitte geben Sie mir ein Hamburger-Set mit Kartoffeln und Ginger Ale (M) Angestellter: Sind Sie sicher, dass Sie das tun möchten? Kunde: Bitte geben Sie mir ein Hamburger-Set mit Kartoffeln und Ginger Ale (M). das ist alles Angestellter: Ich bin schlau
Im Beispiel "stateful" merkt sich der Sachbearbeiter (Server) den Bestellstatus des Kunden (Kunden) (er erbt die vorherigen Informationen). Dies wird als Anwendungsstatus oder Sitzungsstatus bezeichnet. Auf der anderen Seite können Sie sehen, dass sich "zustandslos" nicht an den Bestellstatus erinnert (es überträgt nicht die vorherigen Informationen). Es kann ein Problem sein, wenn es "zustandslos" ist. In diesem Fall verwenden Sie Funktionen wie "Login-Authentifizierung" und "Warenkorb". Wenn Sie die vorherige Mitteilung vergessen haben, müssen Sie Verarbeitungen wie "Anmeldeauthentifizierung" und "Jedes Mal, wenn Sie mehr Produkte wünschen, legen Sie alles wieder in den Warenkorb, einschließlich der Produkte, die Sie in die Vergangenheit gelegt haben".
session
ist eine Funktion, die sich daran erinnert, dass Sie" angemeldet "sind, sodass Sie sich nicht erneut anmelden müssen, selbst wenn Sie nach dem Anmelden die Seiten wechseln. Mit anderen Worten, es ist ein Mechanismus zur Realisierung einer zustandsbehafteten Kommunikation.
Wir überspringen die Erstellung von Controllern und das Routing und erstellen zunächst das Anmeldeformular.
Der größte Unterschied zwischen einem Sitzungsformular und einem Benutzerregistrierungsformular besteht darin, dass es kein Sitzungsmodell für eine Sitzung gibt, sodass es keine Entsprechung zu einer Instanzvariablen wie @user gibt. Daher unterscheiden sich die Informationen, die Sie beim Erstellen eines neuen Sitzungsformulars an form_with helper
übergeben müssen, geringfügig.
form_with(model: @user, local: true)
In Rails wird durch einfaches Schreiben wie oben automatisch festgestellt, dass "die Aktion des Formulars POST an die URL / Benutzer ist", im Fall einer Sitzung jedoch der Umfang der Ressource (hier die Sitzung) und die entsprechende Sie müssen die URL speziell angeben.
form_with(url: login_path, scope: :session, local: true)
Beachten Sie, dass scope :: session
=> Formulardaten in: session gehen.
Als Nächstes wird der im Anmeldeformular eingegebene Inhalt von der Erstellungsaktion des Sitzungscontrollers empfangen, und der Benutzer wird in der Datenbank gefunden und überprüft.
sessions_controller.rb
def create
user = User.find_by(email: params[:session][:email].downcase)
if user && user.authenticate(params[:session][:password])
#Nach der Benutzeranmeldung zur Benutzerinformationsseite umleiten
else
#Erstellen Sie eine Fehlermeldung
render 'new'
end
end
user = User.find_by(email: params[:session][:email].downcase)
(1) Empfangen Sie die im Anmeldeformular eingegebene E-Mail-Adresse mit params, rufen Sie die Benutzerinformationen mit find_by aus der Datenbank ab und verwenden Sie die "casecase-Methode", um eine Übereinstimmung sicherzustellen, wenn eine gültige E-Mail-Adresse eingegeben wird.
if user && user.authenticate(params[:session][:password])
(2) Überprüfen Sie, ob der Benutzer Null ist, und authentifizieren Sie sich mit der Authentifizierungsmethode.
session[:user_id] = user.id
Wenn Sie den obigen Code ausführen, können Sie ihn mit der Sitzungsmethode im Browser speichern und wie eine Variable auf den Browser zugreifen.
#Melden Sie sich als übergebener Benutzer an
def log_in(user)
session[:user_id] = user.id
end
Wenn Sie angemeldet sind, verwenden Sie "current_user", um Informationen zu diesem Benutzer zurückzugeben. Verwenden Sie außerdem die if-Anweisung, um die Anzahl der Datenbankabfragen zu verringern.
#Gibt den aktuell angemeldeten Benutzer zurück (falls vorhanden).
def current_user
if session[:user_id]
@current_user ||= User.find_by(id: session[:user_id])
end
end
Ändern Sie dann das Layout, wenn der Benutzer angemeldet ist und wenn dies nicht der Fall ist. Dafür benötigen wir eine Methode, die den logischen Wert zurückgibt, ob wir angemeldet sind oder nicht, also werden wir ihn implementieren. Der Status, in dem der Benutzer angemeldet ist, bedeutet, dass "die Benutzer-ID in der Sitzung vorhanden ist", dh der Status, in dem "current_user" nicht "nil" ist.
#Gibt true zurück, wenn der Benutzer angemeldet ist, andernfalls false
def logged_in?
!current_user.nil?
end
Verwenden Sie die Methode logged_in?
, Die einen logischen Wert zurückgibt, um das Layout wie folgt zu ändern:
<% if logged_in? %>
#Link für angemeldeten Benutzer
<% else %>
#Link für Benutzer, die nicht angemeldet sind
<% end %>
Entfernen Sie zum Abmelden die Benutzer-ID aus der Sitzung.
#Melden Sie den aktuellen Benutzer ab
def log_out
session.delete(:user_id)
@current_user = nil
end
Recommended Posts