・ 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
・ 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.
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
ruby:show.html.erb
<p>
<%= @user.name %>, <%= @user.email %>
</p>
<p>
<%= @user.created_at %>, <%= @user.updated_at %>
</p>
<p>
<%= Time.now %>
</p>
Si vous ne comprenez pas le comportement, branchez le débogueur près du code qui risque d'être en difficulté!
(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...">
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.
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?
La vulnérabilité d'affectation de masse apparue dans la version 7.3.1 est Cet article peut être facile à comprendre.
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.
/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)
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)
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"]'
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.
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.
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.
>> "#{: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."
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.
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.
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
2. Créons un utilisateur dans l'environnement de production. L'image Gravatar s'affiche-t-elle correctement? → Il a été affiché.
・ 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
・ 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