[RUBY] tutoriel rails Chapitre 8

introduction

Je publierai le processus de progression du tutoriel sur les rails par moi-même.

Cela touche des mots que je n'ai pas compris dans le processus et des erreurs bloquées.

Veuillez signaler toute erreur car il s'agit d'un résultat d'apprentissage personnel.

Puisqu'il s'agit de mon premier article, je pense qu'il y a beaucoup d'endroits difficiles à lire, mais pardonnez-moi s'il vous plaît.

Chapitre 8 Mécanisme de connexion de base

8.1.2 Formulaire de connexion

Je ne comprenais pas comment fonctionne la portée lors de la création du formulaire de connexion, alors je l'ai recherché.

form_with(url: login_path, scope: :session, local: true)

référence https://qiita.com/akilax/items/f36b13f377f7e442bc73

Il semble bon de le considérer comme le préfixe de la valeur de nom nécessaire pour passer des paramètres sans trop réfléchir.

En gros, sous la forme d'un objet qui hérite de Active Recode

<%= form_with(model: @user, local: true) do |f| %>
  <%= f.label :name %>
  <%= f.text_field :name, class: 'form-control' %>
.
.
<% end %>

Et accéder à la valeur d'entrée (valeur du nom de la balise d'entrée générée)

params[:user][:name]

Et le résultat d'entrée a été enregistré dans le hachage de l'utilisateur.

Il en va de même pour ce formulaire de session, et je pense que le résultat d'entrée est enregistré dans le hachage spécifié par scope afin de transmettre la valeur du résultat d'entrée au paramètre.

8.1.4 Afficher le message flash

Affiche un message d'erreur lorsque la connexion échoue.

app/controllers/sessions_controller.rb


#Annonce 8.8:Gère le traitement en cas d'échec de la connexion (avec erreur)
class SessionsController < ApplicationController

  def new
  end

  def create
    user = User.find_by(email: params[:session][:email].downcase)
    if user && user.authenticate(params[:session][:password])
      #Redirection vers la page d'informations de l'utilisateur après la connexion de l'utilisateur
    else
      flash[:danger] = 'Invalid email/password combination' #Pas vraiment correct
      render 'new'
    end
  end

  def destroy
  end
end

En fait, avec le code ci-dessus, une fois que le message flash de demande est affiché, il ne disparaîtra pas. Contrairement à l'utilisation de la redirection dans le Listing 7.27, forcer la méthode de rendu à restituer le modèle affiché n'est pas considéré comme une requête, donc le message de requête ne disparaît pas. Par exemple, si vous entrez délibérément des informations invalides et que vous les envoyez pour afficher un message d'erreur, puis cliquez sur la page d'accueil pour y accéder, le message flash y sera toujours affiché. (tutoriel rails Extrait du chapitre 8)


Ici, la question se pose de savoir pourquoi le message ne disparaît pas à moins qu'il ne soit considéré comme une demande, et pourquoi il peut disparaître car une demande GET est effectuée en cliquant sur la page d'accueil après l'affichage du message d'erreur. J'ai fait.

Pour résoudre cette question, j'ai d'abord étudié la différence entre render et redirect_to.

référence https://qiita.com/january108/items/54143581ab1f03deefa1 Après avoir lu cet article, j'avais encore la question que j'avais fait une demande lorsque j'ai cliqué sur la page d'accueil. Après cela, j'ai recherché diverses choses et j'ai finalement trouvé la réponse. Apparemment, je ne comprenais pas assez le flash.

référence https://pikawaka.com/rails/flash

En d'autres termes, il semble que le message flash soit affiché, puis la demande est reçue, l'action est exécutée, puis le message flash est effacé.

Ainsi, après l'affichage de la vue avec la méthode de rendu, il semblait que le message restait même si je faisais une demande d'accueil.

Comme test

  1. Entrez des informations non valides et envoyez
  2. Vérifiez le message d'erreur
  3. Aller à la page d'accueil
  4. Assurez-vous que le message d'erreur ne disparaît pas sur la page d'accueil
  5. Cliquez à nouveau sur la page d'accueil Ensuite, le message d'erreur a disparu.

C'était vraiment rafraîchissant !!

8.2 Connexion

Les assistants de session Rails sont également automatiquement chargés dans la vue. Si vous chargez ce module dans le contrôleur d'application, qui est la classe parente de tous les contrôleurs Rails, vous pouvez l'utiliser avec n'importe quel contrôleur. (tutoriel rails Extrait du chapitre 8)

Mise en garde Il est automatiquement chargé dans la vue, mais si vous souhaitez utiliser la méthode définie dans l'assistant avec un contrôleur, etc., vous devez le charger avec include.

8.2.2 Utilisateur actuel

Il y a quelque chose de difficile à comprendre sur ce sujet, j'ai donc utilisé la question sur Qiita pour la première fois.

Quand j'ai creusé plus profondément dans le contenu, je n'ai pas compris pourquoi j'aurais dû utiliser la méthode find_by au lieu de la méthode find, alors j'ai posé une question.

Contenu de la question https://qiita.com/shun_study_p/questions/da3de50fe7826dc151ed Merci à ceux qui ont répondu.


@current_user ||= User.find_by(id: session[:user_id])

La valeur logique de l'objet User lui-même est toujours vraie. Grâce à cela, l'appel find_by est exécuté uniquement lorsque rien n'est affecté à @current_user et que des lectures inutiles dans la base de données ne sont pas effectuées. (tutoriel rails Extrait du chapitre 8)

Complétez également la phrase ici

@current_user ||= User.find_by(id: session[:user_id])

Cette phrase consiste à exécuter la méthode find_by et à créer un objet User lorsque @current_user est nul. (L'objet utilisateur est affecté à @current_user) Après cela, @current_user devient un objet User, et comme l'objet User renvoie true, le côté gauche devient vrai après cela, la méthode find_by inutile n'est pas exécutée (car @current_user n'est pas nul) et les données inutiles sont appelées. Cela ne sera pas fait.

8.2.3 Modifier le lien de mise en page

<%= link_to "Profile", current_user %>

Ce qui est fait dans cette phrase en tant que révision

<%= link_to "Profile", "/users/#{current_user.id}" %>
<%= link_to "Profile", user_path(current_user.id) %>
<%= link_to "Profile", user_path(current_user) %>
<%= link_to "Profile", current_user %>

Est abrégé.

Une autre question ici est Vous pouvez voir que nous passons l'objet modèle dans l'argument link_to.

Mais cette fois ce n'est pas une méthode ...?

À ce sujet, je me suis référé à l'article suivant.

Article de référence 1 (également mentionné au chapitre 7) https://qiita.com/Kawanji01/items/96fff507ed2f75403ecb

Article de référence 2 https://teratail.com/questions/198096 Apparemment, si vous renvoyez une instance du modèle dans la valeur de retour, vous pouvez considérer la méthode comme un objet modèle.

8.2.4 Modifications de la mise en page du test

def User.digest(string)
    cost = ActiveModel::SecurePassword.min_cost ? BCrypt::Engine::MIN_COST :
                                                  BCrypt::Engine.cost
    BCrypt::Password.create(string, cost: cost)
end

Cette méthode de résumé sera utilisée dans diverses situations à l'avenir. Par exemple, 9.1.1 réutilise le digest, donc mettons cette méthode digest dans le modèle User (user.rb). Ce calcul ne doit pas être effectué par utilisateur, il n'est donc pas nécessaire d'accéder à l'objet utilisateur, comme dans un fichier de fixture (c'est-à-dire qu'il n'a pas besoin d'être défini dans une méthode d'instance). (tutoriel rails Extrait du chapitre 8)


Je ne comprends pas la signification de la phrase ci-dessus, peut-être que je n'ai pas compris la différence entre la méthode d'instance et la méthode de classe.

Le texte ci-dessus est

  1. Si vous le définissez avec une méthode d'instance, vous devez accéder à l'objet utilisateur.
  2. Cette "méthode de résumé qui renvoie le hachage de la chaîne passée" n'a pas besoin d'être exécutée sur chaque instance de l'utilisateur. (Ce que vous pouvez faire directement à partir de l'objet de classe)

ils ont dit. D'une manière ou d'une autre, je peux comprendre ce que ces deux signifient ...

C'est toujours une compréhension duveteuse, mais j'ai essayé de la résumer moi-même en référence à l'article.

référence https://qiita.com/tbpgr/items/56eb65c0ea5882abbb07

En d'autres termes Les méthodes de classe ont pour rôle de modifier et de référencer les informations sur la classe XX elle-même.

Ainsi, le hachage de mot de passe comme cette fois, les attributs de genre tels que le genre comme dans l'exemple de l'article, peuvent être définis à l'avance avec la méthode de classe.

Les méthodes d'instance ont pour rôle de modifier et de référencer des informations sur des instances individuelles.

Par conséquent, si vous souhaitez faire référence à des informations telles que le mot de passe ou le nom de données spécifiques, utilisez la méthode d'instance. (Il est facile d'imaginer que vous devez accéder à l'objet utilisateur)

Je me demande si c'est un tel endroit ... difficile ...

À la fin

Ce chapitre est également difficile, et certaines parties ont progressé avec environ 70% de compréhension, j'ai donc pensé qu'il était nécessaire de revoir.

Recommended Posts

tutoriel rails Chapitre 6
tutoriel rails Chapitre 1
tutoriel rails Chapitre 7
tutoriel rails Chapitre 5
tutoriel rails Chapitre 10
tutoriel rails Chapitre 9
tutoriel rails Chapitre 8
Mémorandum du didacticiel Rails (Chapitre 3, 3.1)
Tutoriel Rails Chapitre 4 Apprentissage
Tutoriel Rails Chapitre 1 Apprentissage
Tutoriel Rails Chapitre 2 Apprentissage
rails tutry
tutoriel sur les rails
rails tutry
rails tutry
tutoriel sur les rails
tutoriel sur les rails
[Tutoriel Rails Chapitre 4] Rubis à saveur de Rails
Test du tutoriel sur les rails
[Tutoriel Rails Chapitre 5] Créer une mise en page
Mémorandum du didacticiel Rails 1
Tutoriel Rails Memorandum 2
Tutoriel de mastication des rails [Chapitre 2 Application jouet]
[Débutant] Tutoriel Rails
Tutoriel Rails (4e édition) Mémo Chapitre 6
Tutoriel Rails 6e édition Résumé d'apprentissage Chapitre 10
Rails Tutorial 6e édition Résumé de l'apprentissage Chapitre 7
Tutoriel Rails 6e édition Résumé de l'apprentissage Chapitre 4
Tutoriel Rails 6e édition Résumé de l'apprentissage Chapitre 6
Tutoriel Rails 6e édition Résumé de l'apprentissage Chapitre 5
Rails Tutorial 6e édition Résumé de l'apprentissage Chapitre 2
Tutoriel Rails Chapitre 0: Apprentissage préliminaire des connaissances de base 5
Tutoriel Rails 6e édition Résumé de l'apprentissage Chapitre 3
Rails Tutorial 6e édition Résumé d'apprentissage Chapitre 8
Rubis aromatisé aux rails
Fiche technique du didacticiel Rails
[Rails] Didacticiel Apprendre avec les rails
rails Tutorial Fighting Record III
Tutoriel Rails Chapitre 1 De zéro au déploiement [Essayer]
Tutoriel de mastication des rails [Chapitre 3 Création de pages presque statiques]
Résoudre Gem :: FilePermissionError lors de l'exécution de rails d'installation de gem (Tutoriel Rails Chapitre 1)
11.1 Ressource AccountActivations: Mémorandum du didacticiel Rails - Chapitre 11
Registres du didacticiel Rails et mémorandum n ° 0
J'ai essayé Rails débutant [Chapitre 1]
Tutoriel Rails 4e édition: Chapitre 1 De zéro au déploiement
Résoudre ActiveRecord :: NoDatabaseError lors du test des rails (Tutoriel Rails Chapitre 3)
J'ai essayé Rails débutant [Chapitre 2]
[Rails] Implémentation de la fonction tutoriel
Tutoriel Chewing the Rails [Chapitre 1 De zéro au déploiement] Première moitié