[RUBY] Anfänger können den Devise-Code sehen und verstehen, wie er funktioniert [Registrierungen neu]

Einführung

Das Rails-Tutorial ist endlich vorbei. Als ich Devise of Gem einfügte, war ich überrascht, dass die Implementierung von 5 bis 6 Kapiteln im Rails-Tutorial in etwa 10 Minuten abgeschlossen war.

Ich weiß nicht warum es gemacht wurde ... Ich möchte einen Test schreiben, weiß aber nicht, wie ich ihn schreiben soll. Also sagte ich: "Lass uns den offiziellen Code und den Quellcode lesen", aber ich lese ihn, aber ich verstehe ihn überhaupt nicht ... aber ich möchte ihn nach und nach verstehen, also werde ich ihn lesen.

Beim Lesen werde ich zusammenfassen, was ich untersucht habe.

** ・ Ich bin ein Anfänger, möchte aber wissen, wie Devise funktioniert **

Ich hoffe es hilft so einer Person.

GitHub von Devise https://github.com/heartcombo/devise

Übersicht überdenken

Ganz am Anfang der GitHub README steht eine Übersicht.

--Devise ist eine Warden-basierte flexible Authentifizierungslösung für Rails.

  • Gestellbasis.
  • Eine vollständige MVC-Lösung basierend auf der Rails-Engine.
  • Sie können sich gleichzeitig bei mehreren Modellen anmelden.
  • Basierend auf dem Konzept der Modularität. Verwenden Sie nur das, was Sie wirklich brauchen.

Der Aufseher, der hier erscheint, ist ein Juwel für die Authentifizierung, und es scheint, dass er dies in die Irre führt.

Außerdem besteht es aus 10 Modulen, und es scheint, dass Sie das verwenden sollten, was Sie benötigen, während Sie es auskommentieren. Es ist ein Modul oder eine Funktion. Es gab eine Person, die in Qiita einen Tisch gemacht hat, also werde ich ihn unten zitieren.

|Funktion|Überblick| |:-----------------|:----------------| |database_authenticatable |Bei der Anmeldung wird das Kennwort gehasht und in der Datenbank registriert, um die Gültigkeit des Benutzers zu überprüfen. Sie können die POST-Anforderung oder die HTTP-Basisauthentifizierung als Authentifizierungsmethode verwenden.| |registerable |Melden Sie den Benutzer über den Registrierungsprozess an. Außerdem können Benutzer ihre Konten bearbeiten und löschen.| |recoverable |Setzen Sie Ihr Passwort zurück und benachrichtigen Sie es.| |rememberable |Generiert und löscht Token zum Speichern von Benutzern aus gespeicherten Cookies.| |trackable |Notieren Sie die Anzahl der Anmeldungen, die Anmeldezeit und die IP-Adresse.| |validatable |Bietet eine E-Mail- und Passwortüberprüfung. Sie können auch Ihre eigenen definierten Validierungen hinzufügen.| |confirmable |Wir bieten eine gängige Registrierungsmethode an, z. B. das Klicken auf die URL in der E-Mail, um die Hauptregistrierung abzuschließen. Außerdem wird überprüft, ob das Konto bei der Anmeldung authentifiziert wurde.| |lockable |Wenn Sie sich eine bestimmte Anzahl von Malen nicht anmelden, wird Ihr Konto gesperrt. Es gibt zwei Möglichkeiten, es zu entsperren, z. B. das Entsperren per E-Mail oder nach einer bestimmten Zeit.| |timeoutable |Zerstören Sie die Sitzung des Kontos, das für einen bestimmten Zeitraum nicht aktiv war.| |omniauthable |intridea/Unterstützt Omniauth. Verwenden Sie diese Option, wenn Sie eine Authentifizierung wie Twitter oder Facebook hinzufügen möchten.| Quelle: [* Rails *] Verwendung von devise (Rails6-Version) https://qiita.com/cigalecigales/items/16ce0a9a7e79b9c3974e

Devise erstellt auch Helfer zur Verwendung innerhalb des Controllers und der Ansicht. Häufig verwendete Befehle sind voreingestellt.

Der Name des Helfers wird unter der Annahme dargestellt, dass das Gerätemodell "Benutzer" lautet. Wenn das Gerätemodell kein Benutzer ist, wird durch Ersetzen von "_ user" durch "_ your model (beliebiger Modellname)" dieselbe Logik angewendet.

Dies wird auch zitiert, weil es eine Person gab, die es zu einem Tisch in Qiita gemacht hat.

|Methode|Verwenden| |:-----------------|:----------------| |before_action :authenticate_user!|Stellen Sie den Controller ein, um nur angemeldeten Benutzern Zugriff zu gewähren| |user_signed_in?|Stellen Sie fest, ob der Benutzer angemeldet ist| |current_user|Holen Sie sich den angemeldeten Benutzer| |user_session|Zugriff auf Benutzersitzungsinformationen| Quelle: Liste der in Rails devise verfügbaren Hilfsmethoden https://qiita.com/tobita0000/items/866de191635e6d74e392

Registrierungen - Konto anmelden / bearbeiten / löschen

Da diese Registrierung für die CRUD des grundlegendsten Kontos verantwortlich ist, scheint es schwierig zu sein, den Code des funktionalen Teils der Anwendung zu lesen, ohne dies zu wissen.

Ich werde den gesamten Code innerhalb des von oben untersuchten Bereichs ausfüllen, aber es kann schwierig sein, ihn zu verstehen, da er in verschiedene Teile unterteilt ist. Es ist vielleicht etwas einfacher zu verstehen, wenn Sie es sich ansehen, während Sie den Quellcode daneben stellen ...

frozen_string_literal

devise/app/controllers/devise/registrations_controller.rb


# frozen_string_literal: true

Obwohl es auskommentiert ist, scheint es ein Satz zu sein, der für das Upgrade der Ruby-Version vorbereitet wurde. Referenz: Das Prinzip des Methodendesigns, das mir bei Frozen_String_Literal aufgefallen ist https://qiita.com/jkr_2255/items/300b5db8c1f04e1e2815

prepend_before_action

devise/app/controllers/devise/registrations_controller.rb


class Devise::RegistrationsController < DeviseController
  prepend_before_action :require_no_authentication, only: [:new, :create, :cancel]   
  prepend_before_action :authenticate_scope!, only: [:edit, :update, :destroy]
  prepend_before_action :set_minimum_password_length, only: [:new, :edit]

neue Aktion

devise/app/controllers/devise/registrations_controller.rb


 # GET /resource/sign_up
  def new
    build_resource
    yield resource if block_given?
    respond_with resource
  end

devise/app/controllers/devise_controller.rb


  def resource
    instance_variable_get(:"@#{resource_name}")
  end

  # Proxy to devise map name
  def resource_name
    devise_mapping.name 
  end

  alias :scope_name :resource_name

devise/app/controllers/devise_controller.rb


  def devise_mapping 
    @devise_mapping ||= request.env["devise.mapping"]
  end

Wenn Sie auf> name achten und den Code verbinden und das Authentifizierungsmodell User ist, wird @singular =: users.to_s.tr ('/', '_') angezeigt. Singularize.to_sym. Singularize ist eine Methode zum Konvertieren einer Pluralform in eine Singularform. Schließlich ist @singular =: user und der Alias von Singular name, sodass Sie Folgendes erhalten können: user mit Mapping.name. Dann: Benutzer wird an das Argument define_methods übergeben und authenticate_user! Ist abgeschlossen.

Quelle: Learn Rails mit Devise Code Reading https://qiita.com/irisAsh/items/513b8b58f54421b9a1a0

Um es einfach auszudrücken: Ist es auf resource_name gesetzt, da Sie: user mitapping.name erhalten können?

devise/app/controllers/devise/registrations_controller.rb


 def build_resource(hash = {}) #build_resource(hash = {})Definition von
    self.resource = resource_class.new_with_session(hash, session)
  end

Sie können einen Block innerhalb dieser Methode auswerten, indem Sie eine Methode mit einem Code (Block genannt) aufrufen, der in> do ... end oder {...} eingeschlossen ist. Verwenden Sie den Ertragsausdruck, um Ihre eigene Methode mit Blöcken zu definieren. Quelle: Ruby 2.7.0 Referenzhandbuch https://docs.ruby-lang.org/ja/latest/doc/spec=2fcall.html#block

devise/app/controllers/devise_controller.rb


  def respond_with_navigational(*args, &block)
    respond_with(*args) do |format|
      format.any(*navigational_formats, &block)
    end
  end

devise/app/controllers/devise_controller.rb


  def navigational_formats
    @navigational_formats ||= Devise.navigational_formats.select { |format|Mime::EXTENSION_LOOKUP[format.to_s] }
  end

Ich bin mir nicht sicher, deshalb möchte ich studieren und Korrekturen vornehmen.

Es ist so kompliziert, Gem ... Ich habe viel aus nur wenigen Codezeilen gelernt. Ich konnte nur neue Aktionen schreiben, aber am Ende möchte ich nur jede Aktion von registrations_controller aufzeichnen ...!

Vielen Dank für Ihre Beziehung.

Recommended Posts

Anfänger können den Devise-Code sehen und verstehen, wie er funktioniert [Registrierungen neu]
Verstehen Sie das Singleton-Muster, indem Sie Java- und JavaScript-Code vergleichen
Verstehen Sie das Iterator-Muster, indem Sie Java- und JavaScript-Code vergleichen