[Anfänger] Über Rails Session

Einführung

Nachdem wir Kapitel 8 des Rails-Tutorials abgeschlossen haben, werde ich über Session als Ausgabe posten.

Der Unterschied zwischen Staatenlosen und Staatslosen

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".

Was ist eine Sitzung?

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.

Anmeldefunktion implementieren

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.

log_in Methode

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

current_user (aktuell angemeldeter Benutzer)

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 den Layout-Link

Ä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 %>

Ausloggen

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

[Anfänger] Über Rails Session
Informationen zum Rails-Routing
[Rails] Über ActiveJob!
Über Rails Controller
[Anfänger] Rails Tutorial
[Schienen 6] Über die wichtigsten Edelsteine
[Rails] Über aktiven Hash
Informationen zur Versionsspezifikation für Schienen
[Anfänger] Über Active Storage
[Schienen] Standardwerte festlegen
Schienen Starke Parameter
[Swift] [Anfänger]] Über den Bereichsoperator
Informationen zum Benennen von Rails-Modellmethoden
Ich habe Rails Anfänger ausprobiert [Kapitel 1]
[Rails] Informationen zur Struktur des scss-Ordners
[Rails] Informationen zum Rspec-Antworttest
Ich habe Rails Anfänger ausprobiert [Kapitel 2]
Über Rails Scraping-Methode Mechanisieren
[Anfänger] Wenn Schienen nicht funktionieren
[Rails] Einstellung des Sitzungszeitlimits im Gerät
Über das Symbol <%%> in Rails erb
[Java-Anfänger] Über Abstraktion und Schnittstelle
[Rails] Über die Implementierung der Like-Funktion
Überlegungen zu Schienen und sauberer Architektur
[Rails] Temporäre Aufbewahrung von Daten pro Sitzung
[Rails6] Erstelle eine neue App mit Rails [Anfänger]
[Rails 6.0] Informationen zum Batch-Speichern mehrerer Datensätze
Bereitstellen für Heroku [Ruby on Rails] Anfänger
[Ruby on Rails] Informationen zum Active Record-Rückruf
[Java-Anfänger] Informationen zur Initialisierung eines mehrdimensionalen Arrays
[Rails] Über local: true, beschrieben in form_with
[Rails 5] Erstelle eine neue App mit Rails [Anfänger]
[Rails] Unterschied zwischen redirect_to und render [Anfänger]