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
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
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
devise/app/controllers/devise/registrations_controller.rb
# GET /resource/sign_up
def new
build_resource
yield resource if block_given?
respond_with resource
end
resource
est déjà défini dans devise_controller.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
obtient et retourne la valeur de la variable d'instance. Cela semble être la même que la définition de
@ user =. --Référence: Manuel de référence de Ruby 2.7.0 https://docs.ruby-lang.org/ja/latest/method/Object/i/instance_variable_get.html --Il y a une variable appelée
# {resource_name}dans
resource, mais elle est définie dans la partie inférieure. --
devise_mapping.name` Ceci est également déjà défini dans devise_controller, mais si vous regardez l'article cité, il semble y avoir un indice dans une autre partie.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
registrations_controller
d'origine. build
joue un rôle similaire à new
. L'instruction unique build_resource
crée une session avec les variables d'instance de l'utilisateur extraites de la base de données.
--block_given?
Renvoie true si le bloc a été passé lors de l'exécution de la méthode, false s'il n'a pas été passé.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
Dans ce cas, le bloc de ressources est défini comme «yield» et l'authenticité est confirmée par «block_given?». Vous devez en savoir plus sur le rendement. --Référence: yield @variable if block_given? Qu'est-ce que c'est? https://kossy-web-engineer.hatenablog.com/entry/2020/01/19/094958- --Référence: [Introduction à Ruby] Résumé de l'utilisation de yield https://www.sejuku.net/blog/20478
Je pense que respond_with resource
est appelé en relation avec cette zone,
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.