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

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.

Développement du système d'authentification, 5ème étape, enfin à deux chiffres, le chapitre 10 est entré. Terminons l'action REST.   Cliquez ici pour la BGM d'aujourd'hui. PLASTIC GIRL IN CLOSET "TOY" Sera-ce un album il y a 10 ans ... Le temps passe vite. Sora, ma vingtaine est terminée.

[10.1.1 Modification d'un mémo de formulaire et d'un exercice]

-Si vous mettez target = "\ _ blank" dans la balise a du lien, le lien sera ouvert dans un autre onglet. (Les mesures de sécurité sont des exercices) -Rails détermine en interne s'il s'agit d'un nouvel utilisateur ou d'un utilisateur existant à l'aide de la méthode new_record de Active Record.

  1. Comme mentionné précédemment, il y a un petit problème de sécurité lors de l'ouverture d'une nouvelle page avec target = "_ blank". Le fait est que le site lié peut gérer l'objet fenêtre du document HTML. Plus précisément, cela peut conduire à l'introduction de contenus malveillants, tels que les sites de phising. Je ne pense pas que cela se produira sur un site bien connu comme Gravatar, mais au cas où, éliminons également ce risque de sécurité. La solution de contournement consiste simplement à définir l'attribut rel (relation) de la balise a pour le lien sur "noopener". Définissons rapidement ceci sur le lien vers la page d'édition de Gravatar utilisée dans l'extrait 10.2. → Ci-dessous.
<a href="http://gravatar.com/emails" target="_blank" rel="noopener">change</a>

2. Refactorisons la vue new.html.erb (extrait 10.6) et la vue edit.html.erb (extrait 10.7) en utilisant les partiels dans l'extrait 10.5 (supprimons la duplication de code). Conseil: vous pouvez utiliser la méthode de fourniture utilisée dans 3.4.3 pour supprimer les doublons 3. (Si vous avez déjà résolu l'exercice de la liste associée 7.27, vous ne pourrez peut-être pas bien résoudre cet exercice. Sinon, essayez de vous attaquer à cet exercice en réfléchissant à ce qui est différent dans votre code existant. Disons, par exemple, que j'utiliserais la technique de transmission des variables utilisées dans le Listing 10.5 pour passer les URL nécessaires dans le Listing 10.6 et le Listing 10.7 au Listing 10.5.) → Faites-le. (Pour une raison quelconque, je faisais les exercices du chapitre 7, mais il n'y avait aucune différence entre les points de vue. Est-ce que je l'ai renvoyé quand je réfléchissais?)

[10.1.2 Exercice de modification des échecs]

  1. Assurez-vous que la modification échoue si vous envoyez en utilisant un nom d'utilisateur, une adresse e-mail ou un mot de passe non valides à partir du formulaire de modification. → J'ai été correctement renvoyé à la page d'édition et j'ai eu une erreur.

[10.1.3 Exercice de test lorsque l'édition échoue]

  1. Ajoutez une ligne au test du Listing 10.9 et testez si le nombre correct de messages d'erreur est affiché. Astuce: Utilisez l'assert_select présenté dans le tableau 5.2 pour trouver la balise div de la classe d'alerte et examiner le texte «Le formulaire contient 4 erreurs». → Ci-dessous
assert_select "div.alert", "The form contains 4 errors."

[10.1.4 Exercice pour réussir l'édition avec TDD]

  1. Envoyons des informations valides pour voir si l'édition réussit réellement.

  2. Si vous passez à une adresse e-mail appropriée qui n'est pas liée à Gravatar (telle que [email protected]), comment votre image de profil sera-t-elle affichée? Modifiez en fait l'adresse e-mail à partir du formulaire d'édition et changez l'adresse e-mail. Allons vérifier. → Collectivement, changez l'adresse de l'utilisateur de l'échantillon de manière appropriée → Succès, l'image par défaut du grappin s'affiche.

[10.2 Mémo d'approbation]

Authentification: identifie l'utilisateur du site Autorisation: gère ce que les utilisateurs peuvent faire

[10.2.1 Notes et exercices exigeant que les utilisateurs se connectent]

before_action: Dans le contrôleur, exécutez une méthode spécifique juste avant qu'une action ne soit exécutée. Appliquer uniquement à une action spécifique en transmettant uniquement: [: action] à l'option.

  1. Le filtre avant par défaut impose des restrictions sur toutes les actions. Dans ce cas, la page de connexion et la page d'enregistrement de l'utilisateur doivent également être limitées (et le test doit échouer en conséquence). Essayez de commenter la seule option: dans l'extrait 10.15 pour voir si la suite de tests peut détecter l'erreur (si le test échoue). → Yes, RED !

[10.2.2 Exercice pour demander le bon utilisateur]

  1. Pourquoi devons-nous protéger à la fois les actions d'édition et de mise à jour? → L'URL de la ressource users est différente (modifier est / users / 1 / modifier, mettre à jour est / users / 1). Voir le tableau 7.1 au chapitre 7.

2. Laquelle des actions ci-dessus peut être facilement testée avec un navigateur? → Modifier, non? Parce que la requête HTTP est GET. Il sera affiché sur le navigateur.

[10.2.3 Mémos et exercices de transmission amicale]

objet de requête: Reportez-vous au guide Rails. Outre l'URL, il contient également diverses informations côté client.

  1. Écrivons un test et confirmons qu'il n'est transmis que pour la première fois à l'URL transmise par transfert convivial. La prochaine fois que vous vous connectez, l'URL de destination doit revenir à la valeur par défaut (écran de profil). Astuce: Ajoutons un test pour voir si la session [: forwarding_url] du Listing 10.29 est la valeur correcte. → Je n'ai pas compris cela. Le résultat de l'enquête est le suivant. Ce test essaie d'abord d'accéder à edit_user_path (@user), donc vérifiez si la session [: forwarding_url] est égale à cette URL. Et après vous être connecté, vérifiez si vous êtes de retour sur edit_user_url (@user) auquel vous tentiez d'accéder, et assurez-vous que la session [: forwarding_url] est nulle (supprimée). obtenu ~.

users_edit_test.rb


  test "successful edit with friendly forwarding" do
    get edit_user_path(@user)
    assert_equal session[:forwarding_url], edit_user_url(@user)
    log_in_as(@user)
    assert_redirected_to edit_user_url(@user)
    assert_nil session[:forwarding_url]
    assert_redirected_to edit_user_url(@user)
    name = "Foo Bar"
    email = "[email protected]"
    patch user_path(@user), params: { user: {name: name,
                            email: email,
                            password: "",
                            password_confirmation: "" } }
    assert_not flash.empty?
    assert_redirected_to @user
    @user.reload
    assert_equal name, @user.name
    assert_equal email, @user.email
  end

2. Mettons la méthode de débogage introduite en 7.1.3 dans la nouvelle action du contrôleur Sessions. Ensuite, déconnectez-vous et essayez d'accéder à / users / 1 / edit (le débogueur devrait s'arrêter prématurément). Passons maintenant à la console et voyons si la valeur de session [: forwarding_url] est correcte. Vérifiez également la valeur de request.get? Lors de l'accès à la nouvelle action (lors de l'utilisation du débogueur, le terminal s'arrête parfois à des endroits inattendus ou se comporte de manière étrange. J'ai l'impression d'être devenu un développeur de (Colonne 1.1), alors calmons-nous et traitons-le). → Si vous entrez session [: forwarding_url] dans (byebug), l'URL stockée (~ / users / 1 / edit) sera affichée, et si vous entrez request.get?, True sera retourné.

[10.3.1 Exercice de la page de la liste des utilisateurs]

  1. Écrivons un test d'intégration pour tous les liens de la mise en page. Pensez au comportement correct de chaque utilisateur connecté et non connecté. Astuce: Ajoutons un test au Listing 5.32 en utilisant l'assistant log_in_as. → ** Le code ci-dessous que j'ai écrit pour l'essai était VERT, mais est-ce inutile? De plus, il existe 2 modèles. ** **

site_layout_test


require 'test_helper'

class SiteLayoutTest < ActionDispatch::IntegrationTest
  
  def setup
    @user = users(:michael)
  end
  
  test "layout links" do
    get root_path
    assert_template 'static_pages/home'
    assert_select "a[href=?]", root_path, count: 2
    assert_select "a[href=?]", help_path
    assert_select "a[href=?]", about_path
    assert_select "a[href=?]", contact_path
    assert_select "a[href=?]", signup_path
    get contact_path
    assert_select "title", full_title("Contact")
    get signup_path
    assert_select "title", full_title("Sign up")
    log_in_as(@user)
    follow_redirect!  #Ou obtenir un utilisateur_path(@user)
    assert_select "a[href=?]", users_path
    assert_select "a[href=?]", user_path(@user)
    assert_select "a[href=?]", edit_user_path(@user)
    assert_select "a[href=?]", logout_path
  end
  
end

** Différences par rapport aux autres exercices que j'ai examinés ** -Le test pour les utilisateurs connectés est séparé du test pour les utilisateurs non connectés. ⇨ Il peut être préférable de séparer cela compte tenu de la lisibilité du code. Après cela, est-il plus fiable comme test pour séparer clairement les opérations?

-Obtenir root_path après la connexion. ⇨ N'est-ce pas contre nature? Le comportement par défaut après la connexion passe-t-il à la page utilisateur? Pourquoi rentrer à la maison? Donc, puisque log_in_as fait une demande de publication, j'ai pensé que je pourrais réellement aller sur cette page avec follow_redirect! Et la tester, ou je pourrais spécifier la page à tester avec get user_path (@user). Si un problème apparaît plus tard, nous l'examinerons.

[10.3.2 Exemples de notes utilisateur et d'exercices]

Lorsque j'ai mis le faux bijou ici, des lettres rouges sont apparues, alors mettez à jour le paquet. Je m'habitue à ce genre de chose.

  1. Essayez d'accéder à la page d'édition de quelqu'un d'autre et voyez si elle redirige comme implémenté dans 10.2.2. → Si vous essayez d'accéder à ~ / user / 2 / edit, vous serez renvoyé à la maison.

[10.3.3 Exercice Page Nation]

  1. Ouvrez la console Rails, définissez nil dans l'option de page et exécutez-la et vérifiez que l'utilisateur de la première page peut l'obtenir. → Ci-dessous
>> User.paginate(page: nil)
  User Load (1.0ms)  SELECT  "users".* FROM "users" LIMIT ? OFFSET ?  [["LIMIT", 11], ["OFFSET", 0]]
   (0.2ms)  SELECT COUNT(*) FROM "users"
=> #<ActiveRecord::Relation [#<User id: 1, name: "Example User", email: "[email protected]", 
Ci-dessous, il est omis car il est long

2. De quelle classe l'objet de pagination a-t-il été acquis dans l'exercice précédent? En quoi est-il différent de la classe User.all? Comparez-le. → User :: Classe ActiveRecord_Relation. C'est le même.

>> User.paginate(page: nil).class
=> User::ActiveRecord_Relation
>> User.paginate(page: nil).class.superclass
=> ActiveRecord::Relation
>> User.all.class
=> User::ActiveRecord_Relation

[10.3.4 Mémos et exercices de test de la liste d'utilisateurs]

Il existe diverses autres méthodes de pagination, telles que Kaminari et Pagy. (Essayons-le dans le futur)

  1. Essayez de commenter les deux liens de pagination (partie will_paginate) du Listing 10.45 pour voir si le test du Listing 10.48 devient rouge. → Bien sûr, c'est ROUGE.

2. Je les ai commentés tous les deux plus tôt, mais si vous en commentez un seul, assurons-nous que le test reste vert. Quel test dois-je ajouter si je veux tester que les deux liens will_paginate existent? Conseil: Reportez-vous au tableau 5.2 et ajoutez un test pour compter le nombre. Faisons le. → Puisqu'il est encore VERT, le compte: 2 est ajouté.

users_index_test.rb


test "index including pagination" do
    log_in_as(@user)
    get users_path
    assert_template 'users/index'
    assert_select 'div.pagination', count: 2
    User.paginate(page: 1).each do |user|
      assert_select 'a[href=?]', user_path(user), text: user.name
    end
  end

[10.3.5 Exercice de refactoring partiel]

  1. Commentez la ligne de rendu dans l'extrait 10.52 et voyez si le résultat du test devient rouge. → Ce sera ROUGE.

[10.4.1 Exercice utilisateur de gestion]

  1. Confirmons que l'attribut admin ne peut pas être modifié via le Web. Plus précisément, essayez de créer un test qui envoie PATCH directement à l'URL de l'utilisateur (/ users /: id), comme indiqué dans l'extrait 10.56. Pour être sûr que votre test se comporte correctement, commençons par ajouter admin à la liste des paramètres autorisés dans la méthode user_params. Le résultat du premier test doit être rouge. → Je ne savais pas quoi mettre dans FILL_IN, alors je l'ai recherché et j'ai trouvé la réponse ci-dessous. (Tout d'abord, ajoutez: admin pour autoriser la méthode user_params dans le contrôleur utilisateur)

users_controller_test.rb


  test "should not allow the admin attribute to be edited via the web" do
    log_in_as(@other_user)
    assert_not @other_user.admin?
    patch user_path(@other_user), params: {
                                    user: { password:              @other_user.password,
                                            password_confirmation: @other_user.password,
                                            admin: true } }
    assert_not @other_user.reload.admin?
  end

Quoi? Mais sera-ce VERT? Les personnes qui ont écrit la réponse sont-elles vraiment devenues ROUGE? ?? Quand je l'ai recherché, Cet article. @ other_user.password Si vous le faites, vous ne pouvez pas le faire! Donc, quand je l'ai changé en "mot de passe", il est devenu ROUGE. Ensuite, supprimez: admin du permis et le test est VERT.

[10.4.2 Exercice d’action de destruction]

  1. Connectez-vous en tant qu'utilisateur administrateur et essayez de supprimer quelques exemples d'utilisateurs. Quelles informations le journal du serveur Rails affiche-t-il lorsque je supprime un utilisateur? → Vous pouvez voir que l'utilisateur avec l'ID correspondant est SUPPRIMÉ de la base de données.

[10.4.3 Exercice de test de suppression d’utilisateur]

  1. Essayez de commenter l'utilisateur admin avant de filtrer dans l'extrait 10.59 et voyez que le résultat du test devient rouge. → C'était ROUGE en toute sécurité.

Résumé du chapitre 10

-Implémenté éditer, mettre à jour, supprimer. -Afficher la liste des utilisateurs avec index. Mettez en œuvre la pagination avec des gemmes. -Donner l'attribut admin et mettre en œuvre les privilèges de gestion des utilisateurs. Vous pouvez maintenant utiliser admin, qui renvoie une valeur logique. -Exécuter une méthode spécifique avant une action spécifique avec befoure_action. (Il y a aussi after_action) -Friendly forwarding = Stocker la demande de page (GET uniquement) à laquelle vous vouliez accéder dans la session et la rediriger après la connexion. Après cela, la session stockée est supprimée. -Créer des exemples de données (utilisateur) dans db / seedss.rb.

Le chapitre 10 qui avait un certain volume est terminé. Vous avez maintenant implémenté toutes les fonctions de base. Il y a des situations où j'ai des problèmes avec les exercices, mais il n'y a rien que je ne peux pas comprendre si je cherche. Travaillons calmement. Suivant Suivant! Chapitre 11! … Ah, la fonction d'authentification à l'aide d'une adresse e-mail… (yeux distants). La raison en sera expliquée dans les chapitres suivants.

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

Glossaire qui saisit en quelque sorte l'image

・ Transfert Transférez quelque chose. Le transfert amical est-il un «transfert aimable»?

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 10]
(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