[RUBY] Les débutants peuvent voir le code de Devise et comprendre son fonctionnement [registrations new]

introduction

Le tutoriel Rails est enfin terminé. Quand j'ai mis dans Devise of gem, j'ai été surpris que l'implémentation de 5 à 6 chapitres dans le tutoriel Rails soit terminée en 10 minutes environ.

Je ne sais pas pourquoi il a été fait ... Et je veux écrire un test, mais je ne sais pas comment l'écrire. Alors j'ai dit: "Lisons le code officiel et source", mais je l'ai lu, mais je ne le comprends pas du tout ... mais je veux le comprendre petit à petit, donc je vais le lire.

En lisant, je résumerai ce que j'ai étudié.

** ・ Je suis débutant mais je veux savoir comment fonctionne Devise **

J'espère que cela aide une telle personne.

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

Présentation de Devise

Au tout début de GitHub README se trouve un aperçu.

--Devise est une solution d'authentification flexible basée sur Warden pour Rails. --Base de rack. --Une solution MVC complète basée sur le moteur Rails.

  • Vous pouvez vous connecter à plusieurs modèles en même temps.
  • Basé sur le concept de modularité. N'utilisez que ce dont vous avez vraiment besoin.

Le gardien qui apparaît ici est un joyau pour l'authentification, et il semble qu'il tire cela dans le dispositif.

En outre, il est composé de 10 modules, et il semble que vous devriez utiliser ce dont vous avez besoin tout en le décommentant. C'est un module ou une fonction. Il y avait une personne qui a fait une table à Qiita, je vais donc la citer ci-dessous.

|une fonction|Aperçu| |:-----------------|:----------------| |database_authenticatable |Lors de la connexion, le mot de passe est haché et enregistré dans la base de données pour vérifier la validité de l'utilisateur. Vous pouvez utiliser la requête POST ou l'authentification HTTP Basic comme méthode d'authentification.| |registerable |Inscrivez l'utilisateur via le processus d'inscription. Il permet également aux utilisateurs de modifier et de supprimer leurs comptes.| |recoverable |Réinitialisez votre mot de passe et notifiez-le.| |rememberable |Génère et supprime des jetons pour mémoriser les utilisateurs à partir des cookies stockés.| |trackable |Enregistrez le nombre de connexions, l'heure de connexion et l'adresse IP.| |validatable |Fournit une validation par e-mail et mot de passe. Vous pouvez également ajouter vos propres validations définies.| |confirmable |Nous fournissons une méthode d'enregistrement commune, comme cliquer sur l'URL dans l'e-mail pour terminer l'enregistrement principal. Il vérifie également que le compte a été authentifié lors de la connexion.| |lockable |Si vous ne parvenez pas à vous connecter un certain nombre de fois, votre compte sera verrouillé. Il existe deux façons de le déverrouiller, comme le déverrouillage par e-mail ou après un certain laps de temps.| |timeoutable |Détruisez la session du compte qui n'a pas été active pendant un certain temps.| |omniauthable |intridea/Prend en charge l'omniauth. Utilisez-le si vous souhaitez ajouter une authentification telle que Twitter ou Facebook.| Source: [* Rails *] Comment utiliser la devise (version rails6) https://qiita.com/cigalecigales/items/16ce0a9a7e79b9c3974e

Devise crée également des helpers à utiliser dans le contrôleur et la vue. Les commandes fréquemment utilisées sont prédéfinies.

Le nom de l'assistant est illustré en supposant que le modèle de périphérique est «Utilisateur», Si le modèle de l'appareil n'est pas un utilisateur, le remplacement de «_ utilisateur» par «_ votre modèle (tout nom de modèle)» appliquera la même logique.

Ceci est également cité parce qu'il y avait une personne qui en a fait une table à Qiita.

|Méthode|Utilisation| |:-----------------|:----------------| |before_action :authenticate_user!|Défini sur contrôleur pour autoriser l'accès uniquement aux utilisateurs connectés| |user_signed_in?|Déterminer si l'utilisateur est connecté| |current_user|Obtenez l'utilisateur connecté| |user_session|Accéder aux informations de session utilisateur| Source: Liste des méthodes d'assistance disponibles dans Rails concevoir https://qiita.com/tobita0000/items/866de191635e6d74e392

inscriptions - S'inscrire / Modifier / Supprimer un compte

Puisque cet enregistrement est responsable du CRUD du compte le plus basique, il semble difficile de lire le code de la partie fonctionnelle de l'application sans le savoir.

Je vais remplir tout le code dans la plage examinée du haut, mais cela peut être difficile à comprendre car il est divisé en différentes parties. Cela peut être un peu plus facile à comprendre si vous le regardez en plaçant le code source à côté ...

frozen_string_literal

devise/app/controllers/devise/registrations_controller.rb


# frozen_string_literal: true

Bien qu'il soit commenté, cela semble être une phrase préparée pour la mise à niveau de la version Ruby. Référence: Le principe de conception de méthode que j'ai remarqué avec Frozen_string_literal 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]

--Il hérite de DeviseController. En regardant le fichier de code source, devise_controller.rb est hérité non seulement par ce module mais aussi par tous les ** modules. ** ** --prepend_before_action est une ** méthode qui est exécutée avant before_action **. Les actions accessibles sont limitées par l'état de connexion de l'utilisateur. --Référence: documentation Rails https://railsdoc.com/page/prepend_before_action

nouvelle action

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

Si vous faites attention au> nom et connectez le code, si le modèle d'authentification est User, vous pouvez voir @singular =: users.to_s.tr ('/', '_'). Singularize.to_sym. singularize est une méthode pour convertir une forme plurielle en une forme singulière, et enfin @singular =: user et l'alias du singulier est name, donc vous pouvez obtenir: user avec mapping.name. Ensuite: l'utilisateur est passé à l'argument de define_methods et authenticate_user! Est terminé.

Source: Apprendre les rails avec la lecture de code de conception https://qiita.com/irisAsh/items/513b8b58f54421b9a1a0

Pour faire simple, puisque vous pouvez obtenir : user avec mapping.name, est-il réglé sur resource_name?

--Il y a un build_resource au bas du registrations_controller. Cela semble vouloir dire créer une nouvelle session.

devise/app/controllers/devise/registrations_controller.rb


 def build_resource(hash = {}) #build_resource(hash = {})Définition de
    self.resource = resource_class.new_with_session(hash, session)
  end

Vous pouvez évaluer un bloc à partir de cette méthode en appelant une méthode avec un morceau de code (appelé un bloc) inclus dans> do ... end ou {...}. Utilisez l'expression yield pour définir votre propre méthode avec des blocs. Source: Manuel de référence Ruby 2.7.0 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

Je ne suis pas sûr, alors j'aimerais étudier et apporter des corrections.

C'est tellement compliqué Gem ... J'ai beaucoup appris avec seulement quelques lignes de code. Je ne pouvais écrire que de nouvelles actions, mais à la fin je veux garder une trace de la lecture de chaque action de registrations_controller ...!

Merci pour votre relation.

Recommended Posts

Les débutants peuvent voir le code de Devise et comprendre son fonctionnement [registrations new]
Comprendre le modèle Singleton en comparant le code Java et JavaScript
Comprendre le modèle Iterator en comparant le code Java et JavaScript