[RUBY] (Giri) Un employé du gouvernement local dans la vingtaine travaille sur un didacticiel Rails [Chapitre 7]

supposition

・ Le tutoriel Rails est la 4ème édition ・ Cette étude est le 3e tour (2e tour après le chapitre 9) ・ L'auteur est un débutant qui a fait tout Progate

Politique de base

・ Si vous le lisez, vous ne le comprendrez pas. ・ Recherchez et résumez les termes que vous ne comprenez pas (en bas de l'article, glossaire). ・ Plongez dans ce que vous ne comprenez pas. ・ Travaillez sur tous les exercices. ・ Ne copiez pas le code autant que possible.

Le chapitre 7 est le développement du système de connexion et d'authentification, la deuxième étape, et la fonction d'enregistrement des utilisateurs sera ajoutée.

Le BGM d'aujourd'hui est ici pendant la journée quand il pleut beaucoup (au moment de la rédaction de cet article). Littérature ovine "Blue.ep" Encore une fois la littérature ovine. Favoris récents. La première chanson "Ame" est une bonne idée.

[7.1.1 Exercices sur l'environnement de débogage et de rails]

  1. Accédez à / à propos de votre navigateur et vérifiez que les informations de débogage sont affichées. Quel contrôleur et quelle action ont été utilisés lors de l'affichage de cette page? Vérifions le contenu des paramètres. → controller: static_pages   action: about

2. Ouvrez la console Rails, obtenez les premières informations utilisateur de la base de données et stockez-les dans la variable user. Après cela, que voyez-vous lorsque vous exécutez met user.attributes.to_yaml? Comparons le résultat affiché ici avec le résultat de l'exécution de y user.attributes en utilisant la méthode y. → Ci-dessous. Cette façon d'écrire est YAML. Le résultat est le même.

>> user = User.first
  User Load (0.6ms)  SELECT  "users".* FROM "users" ORDER BY "users"."id" ASC LIMIT ?  [["LIMIT", 1]]
=> #<User id: 1, name: "nakamura", email: "[email protected]", created_at: "2020-09-10 02:37:56", updated_at: "2020-09-10 03:07:11", password_digest: "$2a$10$A5n.HFBigQfwnWVJZw2N0e4M9sxPaR8ndLZwqtZWYS7...">

>> puts user.attributes.to_yaml
---
id: 1
name: nakamura
email: [email protected]
created_at: !ruby/object:ActiveSupport::TimeWithZone
  utc: &1 2020-09-10 02:37:56.040628000 Z
  zone: &2 !ruby/object:ActiveSupport::TimeZone
    name: Etc/UTC
  time: *1
updated_at: !ruby/object:ActiveSupport::TimeWithZone
  utc: &3 2020-09-10 03:07:11.190666000 Z
  zone: *2
  time: *3
password_digest: "$2a$10$A5n.HFBigQfwnWVJZw2N0e4M9sxPaR8ndLZwqtZWYS7gJGH/Ulohe"
=> nil

>> y user.attributes
---
id: 1
name: nakamura
email: [email protected]
created_at: !ruby/object:ActiveSupport::TimeWithZone
  utc: &1 2020-09-10 02:37:56.040628000 Z
  zone: &2 !ruby/object:ActiveSupport::TimeZone
    name: Etc/UTC
  time: *1
updated_at: !ruby/object:ActiveSupport::TimeWithZone
  utc: &3 2020-09-10 03:07:11.190666000 Z
  zone: *2
  time: *3
password_digest: "$2a$10$A5n.HFBigQfwnWVJZw2N0e4M9sxPaR8ndLZwqtZWYS7gJGH/Ulohe"
=> nil

[7.1.2 Exercice sur les ressources des utilisateurs]

  1. En utilisant Ruby intégré, affichons les valeurs des colonnes magiques (created_at et updated_at) sur la page de présentation (extrait 7.4).
  2. Affichons le résultat de Time.now sur la page d'affichage en utilisant Ruby intégré. Comment le résultat change-t-il lorsque j'actualise la page? Vérifiez-le. → Don tous ensemble! (Parce qu'il était ennuyeux d'être affichés collés, un saut de ligne est fait avec la balise p.) Lorsque la page est actualisée, l'heure actuelle est mise à jour et affichée.

ruby:show.html.erb


<p>
  <%= @user.name %>, <%= @user.email %>
</p>
<p>
  <%= @user.created_at %>, <%= @user.updated_at %>
</p>
<p>
  <%= Time.now %>
</p>

[7.1.3 mémos et exercices de méthode de débogage]

Si vous ne comprenez pas le comportement, branchez le débogueur près du code qui risque d'être en difficulté!

  1. Insérez le débogueur dans l'action show (Listing 7.6) et essayez d'accéder à / users / 1 depuis votre navigateur. Accédez ensuite à la console et utilisez la méthode put pour afficher le contenu du hachage des paramètres au format YAML. Conseil: veuillez vous référer à l'exercice en 7.1.1.1. Comment les informations de débogage étaient-elles affichées par la méthode de débogage au format YAML dans cet exercice? → Ci-dessous
(byebug) puts @user.attributes.to_yaml
---
id: 1
name: nakamura
email: [email protected]
created_at: !ruby/object:ActiveSupport::TimeWithZone
  utc: &1 2020-09-10 02:37:56.040628000 Z
  zone: &2 !ruby/object:ActiveSupport::TimeZone
    name: Etc/UTC
  time: *1
updated_at: !ruby/object:ActiveSupport::TimeWithZone
  utc: &3 2020-09-10 03:07:11.190666000 Z
  zone: *2
  time: *3
password_digest: "$2a$10$A5n.HFBigQfwnWVJZw2N0e4M9sxPaR8ndLZwqtZWYS7gJGH/Ulohe"
nil

2. Insérez le débogueur dans la nouvelle action et essayez d'accéder à / users / new. À quoi ressemble @user? Découvrez-le. → Ci-dessous

(byebug) @user
Started GET "/users/new" for 49.104.6.138 at 2020-09-10 06:51:27 +0000
#<User id: 1, name: "nakamura", email: "[email protected]", created_at: "2020-09-10 02:37:56", updated_at: "2020-09-10 03:07:11", password_digest: "$2a$10$A5n.HFBigQfwnWVJZw2N0e4M9sxPaR8ndLZwqtZWYS7...">

[7.1.4 Image gravatar et exercice de la barre latérale]

Il y a une erreur ici. L'image gravatar n'est pas affichée. Juste au cas où, même si j'écrase le code manuscrit par copier-coller, il ne s'affiche pas. Cela signifie ... Affichage: aucun; dans SCSS Mais l'avez-vous fait? Après tout, j'ai cherché en réfléchissant. Le temps où l'image a été effacée dans l'exercice du chapitre 5 est resté. C'est le travail du chaton! !! Mais pardonne-moi car c'est mignon! !! Je l'ai résolu en supprimant le code de la balise img.

  1. (Facultatif) Créez un compte sur Gravatar et essayez d'associer votre adresse e-mail à une image appropriée. Essayons de hacher MD5 l'adresse e-mail et voyons si l'image liée s'affiche correctement. → Il était affiché lorsque j'ai enregistré l'image et créé un nouvel utilisateur sur la console. gravatar.png

2. Modifiez l'assistant gravatar_for défini dans 7.1.4 comme indiqué dans le Listing 7.12 afin que size puisse être reçu comme argument optionnel. Si vous pouvez bien le changer, vous pourrez l'appeler gratar_for user, taille: 50. Important: cet assistant amélioré sera en fait utilisé dans 10.3.1. N'oubliez pas de le mettre en œuvre. → Écrivez simplement comme indiqué dans l'extrait 7.12.

3. Les arguments optionnels sont encore couramment utilisés dans la communauté Ruby, mais peuvent également être obtenus avec la nouvelle fonctionnalité "Arguments de mots clés" introduite dans Ruby 2.0. Voyons que le remplacement du Listing 7.12 modifié par le Listing 7.13 fonctionne correctement. Quelle est la différence entre les deux méthodes de mise en œuvre? Pensez-y. → Hmm, j'ai fait des recherches sur diverses choses, mais je ne comprends pas la différence de comportement. J'ai trouvé que l'avantage était que la notation pouvait être simplifiée. J'ai également découvert la signification de chaque terme.

Argument de mot-clé: un argument avec une clé définie dans l'argument. Clarifiez ce que vous mettez dans l'argumentation. Argument facultatif: vous pouvez transmettre différentes valeurs de manière flexible. Très extensible. Cependant, si la valeur à passer augmente, il sera difficile de la maintenir plus tard. La lisibilité est également réduite.

Alors, l'argument mot-clé est-il introduit dans les versions ultérieures dans le but d'écrire du code de manière concise? Si vous écrivez l'argument option, vous écrivez du code supplémentaire dans la définition de la taille. Une telle réponse est-elle acceptable?

[7.2.1 Exercice avec form_for]

  1. En guise de test, remplacez: name dans l'extrait 7.15 par: nome. Quel message d'erreur vais-je recevoir? → undefined method `nome' for #User:0x00007f6b8d40b370
  2. A titre de test, essayez de remplacer toutes les variables f du bloc par foobar et vérifiez que le résultat ne change pas. Bien sûr, le résultat ne change pas, mais cela ne semble pas être un bon changement pour nommer la variable foobar. Pensez pourquoi. → Il est difficile d'écrire simplement, et f est f sous forme. L'utilisation de mots sans rapport rend la lecture plus difficile. (Je n'ai posté aucune preuve, mais j'ai volontairement tout réécrit dans foobar!)

[7.2.2 Formulaire HTML pratique]

  1. Learn Assez de HTML pour être dangereux transcrit tout le HTML manuellement. Pourquoi n'avez-vous pas utilisé la balise form? Pensez à la raison. → Je ne sais pas en le lisant, mais c'est parce que je n'utilise pas input / send. (Ne l'utilise pas)

[7.3.2 Mémos et exercices sur les paramètres forts]

La vulnérabilité d'affectation de masse apparue dans la version 7.3.1 est Cet article peut être facile à comprendre.

  1. Accédez à / signup? Admin = 1 et vérifiez à partir des informations de débogage que l'attribut admin est inclus dans les paramètres. → C'est ça? --- !ruby/object:ActionController::Parameters parameters: !ruby/hash:ActiveSupport::HashWithIndifferentAccess admin: '1' controller: users action: new permitted: false

[7.3.3 Mémo de message d'erreur et pratique]

vide? Méthode: true si l'objet est vide, false sinon any? method: true s'il y a au moins un élément, false s'il n'y en a pas Méthode de pluralisation: le sens du mot est «pluralité (forme)». Comme vous pouvez le voir, cela transforme le mot anglais de l'argument donné plus tard au pluriel basé sur l'entier de l'argument donné au visiteur.

  1. Assurez-vous que si vous modifiez le nombre minimum de caractères à 5, le message d'erreur sera mis à jour automatiquement. → Ci-dessous. Le mot de passe est trop court (5 caractères au minimum) s'affiche.

/models/user.rb


validates :password, presence: true, length: { minimum: 5 }

2. Comparez l'URL du formulaire d'inscription d'utilisateur non soumis (Fig. 7.12) avec l'URL du formulaire d'inscription d'utilisateur soumis (Fig. 7.18). Pourquoi les URL sont-elles différentes? Pensez-y. → Avant d'envoyer: ~ / signup * ~ est l'adresse AWS Après l'envoi: ~ / users Puisque je fais une demande POST pour l'enregistrement d'un utilisateur, est-il normal de comprendre que cela passe à / users en fonction de la ressource des utilisateurs? (Voir le tableau 7.1 dans le didacticiel)

[7.3.4 Mémos d'essai et exercices au moment de l'échec]

La méthode count peut être utilisée avec n'importe quelle classe Active Record. A partir de là, le contenu du test se complique. Suivons la signification de chaque code. Les exercices ici sont lourds, mais réfléchissons-y. (Veuillez me pardonner si je fais une erreur)

  1. Écrivez un test pour le message d'erreur implémenté dans l'extrait 7.20. C'est à vous de déterminer le niveau de détail que vous souhaitez tester. J'ai préparé un modèle dans l'extrait 7.25 pour votre référence. → Selon le modèle, il teste si le CSSid et la classe du message d'erreur sont affichés, donc si vous réécrivez la partie concernée comme suit, le test est VERT.

users_signup_test.rb


assert_select 'div#error_explanation'
assert_select 'div.field_with_errors'

2. L'URL du formulaire d'inscription utilisateur est / signup, mais si vous envoyez des données d'inscription utilisateur non valides, l'URL deviendra / users. Ceci est le résultat de la différence entre la route nommée (/ signup) ajoutée dans le Listing 5.43 et les paramètres par défaut pour le routage RESTful (Listing 7.3). Utilisez le contenu du Listing 7.26 et du Listing 7.27 pour essayer de résoudre ce problème. Espérons que les deux URL devraient être / signup. Oh, mais le test est toujours vert ... pourquoi? (Pensez-y) → Selon les paramètres de routage du Listing 7.26, il y a deux destinations après l'échec de l'enregistrement (les URL sont / users et / signup). En conséquence, les deux sont dans un état où ils peuvent être détectés par le test, de sorte qu'ils ne deviennent pas ROUGE.

3. Modifions la partie post du Listing 7.25 pour qu'elle corresponde à la nouvelle URL (/ signup) créée dans l'exercice précédent. Assurez-vous également que le test reste vert. → Remplacez users_path par signup_path. Je viens de changer ce qui est détecté dans le test, donc il reste VERT.

users_signup_test.rb


  test "invalid signup information" do
    get signup_path
    assert_no_difference 'User.count' do
      post signup_path, params: { user: { name: "",
  #(Omis ci-dessous)

4. Essayez de remettre le formulaire du Listing 7.27 à son état précédent (Listing 7.20) et assurez-vous que le test est toujours vert. C'est un problème, car l'URL à laquelle le message est actuellement envoyé est incorrecte. Ajoutons un test utilisant assert_select au Listing 7.25 afin que nous puissions détecter ce bogue (l'ajout d'un test et l'obtention du rouge sont réussies). Revenez ensuite au formulaire modifié (extrait 7.27) et voyez que le test devient vert. Astuce: au lieu de soumettre et de tester à partir d'un formulaire, concentrez-vous sur la présence de la partie "formulaire [action =" / signup "]". → Supprimez ", url: signup_path" de form_for (@user, url: signup_path). Si l'enregistrement échoue dans cet état, l'URL sera / users. Comme ce n'est pas bon, j'ai ajouté la phrase suivante au test afin qu'il puisse être détecté. Le résultat est ROUGE. Ainsi, lorsque je retourne la destination du formulaire à l'état indiqué dans l'extrait 7.27 pour le faire / chanter à nouveau, le test est VERT. J'ai mis du temps à comprendre. Si vous ne pouvez pas comprendre l'exercice 2, vous ne pouvez pas comprendre la suite. N'abandonnez pas, recherchez jusqu'à ce que vous le compreniez, pensez-y et résolvez-le.

users_signup_test.rb


assert_select 'form[action="/signup"]'

[7.4.1 Remplissage du formulaire d'inscription Notes et exercices]

redirect_to @user → redurect_to user_url(@user) Railsf l'interprète et l'exécute sans autorisation. Quelle est la différence entre redirect_to et reder? Est-ce que je peux? Je suis curieux. J'étais curieux, alors j'ai recherché. Puisque redirec_to spécifie l'URL, il semble qu'il effectue une série d'opérations via le routeur. Utilisé lorsqu'il y a une mise à jour des données, etc. Lorsque le rendu affiche directement la vue. Il s'agit d'un processus simple qui n'implique aucune modification des données.

  1. Envoyez des informations valides et utilisez la console Rails pour confirmer que l'utilisateur a bien été créé. → Vous pouvez vous enregistrer en tant qu'utilisateur à partir de l'écran d'enregistrement réel et le trouver de manière appropriée sur la console.

  2. Mettez à jour le listing 7.28 et voyez que redirect_to user_url (@user) et redirect_to @user donnent le même résultat. → Le même résultat sera obtenu.

[7.4.2 exercice flash]

  1. Accédez à la console et appelez le symbole avec le développement d'expression (4.2.2) dans la chaîne de caractères. Par exemple, si vous exécutez un code tel que "# {: success}", quelle valeur sera renvoyée? Vérifiez-la. → Ci-dessous. Une chaîne sera renvoyée.
>> "#{:success}"
=> "success"

2. Pensez à ce à quoi ressemblera le flash du Listing 7.30, en vous référant aux résultats que vous avez essayés dans l'exercice précédent. → Je ne sais pas ce que vous cherchez, mais qu'est-ce que c'est?

>> flash = { success: "It worked!", danger: "It failed." }
=> {:success=>"It worked!", :danger=>"It failed."}
>> "#{flash[:success]}"
=> "It worked!"
>> "#{flash[:danger]}"
=> "It failed."

[7.4.3 Exercice d'enregistrement réel de l'utilisateur]

  1. Utilisez la console Rails pour vérifier à nouveau si un nouvel utilisateur a vraiment été créé. Le résultat devrait ressembler à l'extrait 7.32. → Essayez-le.

2. Essayez de vous enregistrer avec votre propre adresse e-mail. Si vous êtes déjà inscrit sur Gravatar, veuillez vérifier si l'image appropriée est affichée. → Essayez cela aussi.

[7.4.4 Exercice de test réussi]

  1. Ecrivez un test pour Flash implémenté en 7.4.2. C'est à vous de déterminer le niveau de détail que vous souhaitez tester. J'ai fourni un modèle minimal dans le Listing 7.34 pour votre référence (remplacez FILL_IN par le code approprié et vous avez terminé). Au fait, les tests sur texte sont fragiles. C'est la même chose pour les touches flash avec moins de texte. Dans mon cas, je teste souvent simplement si le flash est vide. → OK si vous mettez la méthode vide? Dans FILL_IN.

  2. Comme je l'ai souligné dans le texte, le HTML pour flash (Liste 7.31) est difficile à lire. Passons au code du Listing 7.35, qui est plus facile à lire. Après avoir apporté les modifications, exécutez la suite de tests pour vous assurer qu'elle fonctionne. Notez que ce code utilise l'assistant content_tag de Rails. → Exécutez comme indiqué.

3. Assurons-nous que le test échoue lorsque nous commentons la ligne de redirection dans l'extrait 7.28. → Cela échouera.

4. Disons que vous avez remplacé @ user.save par false dans le Listing 7.28 (en supposant que vous ayez intégré un bogue). Comment le test assert_difference détecterait-il alors ce bogue? Jetez un œil au code du test. → L'erreur suivante se produit. Cela signifie-t-il que le nombre d'utilisateurs n'a pas augmenté?

 "User.count" didn't change by 1.
        Expected: 1
          Actual: 0

[7.5.3 Exercice de test réussi]

  1. Accédez à l'environnement de production (Heroku) à partir de votre navigateur et vérifiez si la marque de verrouillage SSL est appliquée et si l'URL est https. → Il était verrouillé.

2. Créons un utilisateur dans l'environnement de production. L'image Gravatar s'affiche-t-elle correctement? → Il a été affiché.

Résumé du chapitre 7

・ Sass est pratique après tout. ・ Faites attention à la différence entre les itinéraires RESTfull et les itinéraires définis individuellement. ・ Quelle est la fréquence de Gravatar? Est-ce populaire sur wordpress et ainsi de suite? ・ Form_for semble être remplacé par form_with, donc pour référence. ・ Utilisez correctement render et redirect_to. -Afficher un message flash. ・ Mesures contre les vulnérabilités d'attribution de masse avec des paramètres forts. -Amélioration de la sécurité avec SSL.

Les exercices de ce chapitre étaient croustillants. Vous devez réfléchir à chaque code et à chaque comportement pourquoi cela se produit. Travaillons dessus sans abandonner la réflexion. Ensuite, préparons le chapitre 8, le mécanisme de connexion.

Allez au chapitre 8! Cliquez ici pour le chapitre 6 Cliquez ici pour les conditions préalables et le statut de l'auteur pour l'apprentissage

Glossaire qui saisit en quelque sorte l'image

・ Assert_difference (assert_no_difference) Testez si les nombres (résultats) donnés dans les arguments (en supposant l'utilisation dans ce chapitre) sont différents avant et après l'exécution du traitement par bloc. Le premier est différent, no_difference confirme qu'il n'y a pas de différence.

・ SSL (Secure Sockets Layer) Un protocole de communication qui nécessite de la sécurité. Actuellement, il a été remplacé par TLS (Transport Layer Security), mais il est appelé SSL dans les vestiges du passé.

Recommended Posts

(Giri) Un employé du gouvernement local dans la vingtaine travaille sur un tutoriel Rails [Chapitre 11]
(Giri) Un employé du gouvernement local dans la vingtaine travaille sur un didacticiel Rails [Chapitre 1]
(Giri) Un employé du gouvernement local dans la vingtaine travaille sur un didacticiel Rails [Chapitre 14]
(Giri) Un employé du gouvernement local dans la vingtaine travaille sur un didacticiel Rails [Chapitre 12]
(Giri) Un employé du gouvernement local dans la vingtaine travaille sur un didacticiel Rails [Chapitre 5]
(Giri) Un employé du gouvernement local dans la vingtaine travaille sur un didacticiel Rails [Chapitre 3]
(Giri) Un employé du gouvernement local dans la vingtaine travaille sur un didacticiel Rails [Chapitre 4]
(Giri) Un employé du gouvernement local dans la vingtaine travaille sur un didacticiel Rails [Chapitre 8]
(Giri) Un employé du gouvernement local dans la vingtaine travaille sur un didacticiel Rails [Chapitre 6]
(Giri) Un employé du gouvernement local dans la vingtaine travaille sur un didacticiel Rails [Chapitre 13]
(Giri) Un employé du gouvernement local dans la vingtaine travaille sur un didacticiel Rails [Chapitre 9]
(Giri) Un employé du gouvernement local dans la vingtaine travaille sur un didacticiel Rails [Chapitre 7]
(Giri) Un employé du gouvernement local dans la vingtaine travaille sur un didacticiel Rails [Chapitre 2]
(Giri) Un employé du gouvernement local dans la vingtaine travaille sur un didacticiel Rails [Introduction]
(Ruby on Rails6) Création de données dans une table
tutoriel rails Chapitre 7
tutoriel rails Chapitre 5
tutoriel rails Chapitre 10
tutoriel rails Chapitre 8
[Tutoriel Rails Chapitre 2] Que faire lorsque vous faites une erreur dans le nom de la colonne
Tutoriel Rails Chapitre 3 Apprentissage
Mémorandum du didacticiel Rails (Chapitre 3, 3.1)
Tutoriel Rails Chapitre 4 Apprentissage
Tutoriel Rails Chapitre 1 Apprentissage
Tutoriel Rails Chapitre 2 Apprentissage
Difficultés à créer un environnement Ruby on Rails (Windows 10) (SQLite3)
Comment afficher des graphiques dans Ruby on Rails (LazyHighChart)
Appliquer le CSS à une vue spécifique dans Ruby on Rails