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

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.

Nous entrerons dans le chapitre 11 de la 6ème étape du développement du système d'authentification. Du point de vue du renforcement de la sécurité, nous inclurons des étapes pour activer le compte. C'est une personne ordinaire qui reçoit un e-mail après l'inscription et suit le lien pour terminer l'inscription.   Cliquez ici pour la BGM d'aujourd'hui. Tatuki Seksu "Hanazawa EP" J'aime le fait que j'ai emballé diverses choses suspectes avec Shuge Sound.

[11.1.1 Exercice du contrôleur des activations de compte]

  1. Confirmons qu'il devient vert lorsque la suite de tests est exécutée à ce moment. → C'est VERT car je n'ai pas encore passé de test.

2. La route nommée dans le tableau 11.2 indique que \ _url doit être utilisé à la place de \ _path. Pourquoi, pensez-y. Astuce: Nous allons maintenant utiliser la route nommée dans nos e-mails. → path est un chemin relatif (/ ou une forme abrégée), url est un chemin absolu (https: ~~ ou une forme complète). Je pense que le chemin absolu, qui est la forme complète de l'url, est nécessaire pour traiter les rails extérieurs appelés mail.

[11.1.2 Mémos et exercices du modèle de données d’activation de compte]

Dans le callback, une méthode spécifique peut être exécutée juste avant l'action de before_〇〇, 〇〇. C'est ce qu'on appelle une référence de méthode. Ceci est recommandé plutôt que de passer un bloc. (Révision) En définissant une méthode ci-dessous privée, elle peut rester privée de l'extérieur.

  1. Assurez-vous que la suite de tests reste verte après avoir effectué les modifications dans cette section. → GREEN

2. Créez une instance de la classe User à partir de la console et vérifiez que NoMethodError se produit lorsque vous essayez d'appeler la méthode create_activation_digest à partir de cet objet (car il s'agit d'une méthode Private). Vérifiez également la valeur du condensé de cet objet User. → Ce genre de sentiment

>> user = User.third
  User Load (0.1ms)  SELECT  "users".* FROM "users" ORDER BY "users"."id" ASC LIMIT ? OFFSET ?  [["LIMIT", 1], ["OFFSET", 2]]
=> #<User id: 3, name: "Mr. Sage Hartmann", email: "[email protected]", created_at: "2020-09-17 08:34:09", updated_at: "2020-09-17 08:34:09", password_digest: "$2a$10$.HyqPb.DwmFICve62DsYte1alLAVihIdeS2F8Rjndry...", remember_digest: nil, admin: false, activation_digest: "$2a$10$9VKv/p9kYrz84SdMs/7s/uzEV3mqzGMmTubIq7.Vz4b...", activated: true, activated_at: "2020-09-17 08:34:09">
>> user.create_activation_digest
Traceback (most recent call last):
        1: from (irb):2
NoMethodError (private method `create_activation_digest' called for #<User:0x000000000426b7a0>)
Did you mean?  restore_activation_digest!
>> user.activation_digest
=> "$2a$10$9VKv/p9kYrz84SdMs/7s/uzEV3mqzGMmTubIq7.Vz4bbIb.ZeLDRy"

3. Dans l'extrait 6.34, j'ai appris qu'il existe une méthode appelée email.downcase! (Pas besoin de remplacer) pour réduire les adresses e-mail. Essayez d'utiliser cette méthode pour améliorer la méthode downcase_email du Listing 11.3. De plus, si vous pouvez apporter les modifications, assurez-vous que la suite de tests reste réussie. → Changez-le simplement en email.downcase!.

user.rb


    def downcase_email
      email.downcase!
    end

[11.2.1 Exercice d'envoi d'un e-mail pour l'activation du compte]

  1. Ouvrez la console et vérifiez que vous pouvez échapper la chaîne d'adresse e-mail avec la méthode d'échappement du module CGI (Listing 11.15). Quel est le résultat d'échapper à "Ne paniquez pas!" Avec cette méthode? → Ci-dessous. (Les paramètres de requête et CGI sont inclus dans le glossaire)
>> CGI.escape('[email protected]')
=> "foo%40example.com"
>> CGI.escape("Don't panic!")            
=> "Don%27t+panic%21"

[11.2.2 Aperçu du courrier et des exercices envoyés]

Si vous utilisez AWS cloud9, le didacticiel utilise l'ancien cloud9, de sorte que le contenu que vous entrez dans «exemple.com» est assez différent, ce qui est déroutant, mais le contenu est le même. Démarrez le serveur Rails et copiez et collez tout ce qui se trouve sous https: // de l'URL de l'écran affichée dans un autre onglet.

  1. Utilisez la fonction d'aperçu Rails pour afficher l'e-mail précédent de votre navigateur. Quel type de contenu est affiché dans la colonne "Date"? → La date d'aujourd'hui et l'UTC (Accord World Time) sont affichés. (Le mot "Accord World Time" n'est-il pas cool?

[11.2.3 Mémos et exercices de test du courrier sortant]

L'assert_match ici ne correspond pas tout à fait, mais je suis conscient que je teste le contenu de l'e-mail pour le nom, le jeton d'activation et le mailad échappé.

  1. À ce stade, assurez-vous que la suite de tests est verte. → Yes, GREEN !

2. Confirmons que le test passe au rouge lorsque la partie CGI.escape utilisée dans l'extrait 11.20 est supprimée. → Est-ce ROUGE parce que l'adresse e-mail contient des méta-caractères et ce n'est pas une expression régulière à moins qu'elle ne soit échappée? Voir cet article.

[11.2.4 Mettre à jour l'utilisateur créer des notes et des exercices d'action]

delivery_now: Comme son nom l'indique, le processus d'envoi de courrier est exécuté à ce moment.

  1. Lorsque vous enregistrez un nouvel utilisateur, confirmons que la destination de la redirection a été remplacée par une URL appropriée. Vérifiez ensuite le contenu du courrier sortant dans le journal du serveur Rails. Quelle est la valeur du jeton d'activation? → Je suis rentré chez moi. Bienvenue dans l'exemple d'application! Cliquez sur le lien ci-dessous pour activer votre compte: La chaîne de caractères aléatoires contenue dans l'URL suivante est le jeton d'activation.

2. Ouvrez la console et vérifiez que l'utilisateur a été créé sur la base de données. Assurez-vous également que cet utilisateur figure dans la base de données, mais que l'état d'activation reste faux. → Il a été activé: faux.

[11.3.1 Notes et exercices d'abstraction de méthode vérifiée]

Je ne sais pas de quel condensé je parle. Revenez ensuite au tableau 11.1 au début du chapitre 11. Je dois garder une trace de ce dont je parle. Ainsi, le titre de cette section semble être plus général que abstrait. La méthode authentifiée? Peut être utilisée avec n'importe lequel des modèles du Tableau 11.1.

  1. Essayez de créer un nouvel utilisateur dans la console. Quelles sont les valeurs des jetons de mémoire et des jetons d'activation du nouvel utilisateur, et quelles sont les valeurs de résumé pour chaque jeton? → Ça ressemble à ça. Le système mémoire reste nul car il vient d'être créé par l'utilisateur ...
>> user = User.create(name: "muteki", email: "[email protected]", password: "mutekimuteki", password_confirmation: "mutekimuteki")
   (0.1ms)  SAVEPOINT active_record_1
  User Exists (0.2ms)  SELECT  1 AS one FROM "users" WHERE LOWER("users"."email") = LOWER(?) LIMIT ?  [["email", "[email protected]"], ["LIMIT", 1]]
  SQL (2.5ms)  INSERT INTO "users" ("name", "email", "created_at", "updated_at", "password_digest", "activation_digest") VALUES (?, ?, ?, ?, ?, ?)  [["name", "muteki"], ["email", "[email protected]"], ["created_at", "2020-09-17 12:57:50.404544"], ["updated_at", "2020-09-17 12:57:50.404544"], ["password_digest", "$2a$10$eDPAP444JbjJDGucKnoFE.MWFBTAR8dxQ.wXPJfzql9E0TPRVDQfq"], ["activation_digest", "$2a$10$zql927sHRszT.bjitRxBn.slJil.Zvc74AJkztqBZzt7kUiSqBgx."]]
   (0.1ms)  RELEASE SAVEPOINT active_record_1
=> #<User id: 102, name: "muteki", email: "[email protected]", created_at: "2020-09-17 12:57:50", updated_at: "2020-09-17 12:57:50", password_digest: "$2a$10$eDPAP444JbjJDGucKnoFE.MWFBTAR8dxQ.wXPJfzql9...", remember_digest: nil, admin: false, activation_digest: "$2a$10$zql927sHRszT.bjitRxBn.slJil.Zvc74AJkztqBZzt...", activated: false, activated_at: nil>

Donc, je crée volontairement un système de mémoire.

>> remember_token = User.new_token
=> "5dyf7BoW9H3H9SYH6VPRYg"
>> remember_digest = User.digest(remember_token)
=> "$2a$10$1CymqXEPzP.b05TblQ3Zye/ukhNblEpGlDxI4kT2VoiLUJK1EHVy2"
>> user.update_attribute(:remember_token, remember_token)
   (0.1ms)  SAVEPOINT active_record_1
   (0.1ms)  RELEASE SAVEPOINT active_record_1
=> true
>> user.update_attribute(:remember_digest, remember_digest)
   (0.1ms)  SAVEPOINT active_record_1
  SQL (0.2ms)  UPDATE "users" SET "updated_at" = ?, "remember_digest" = ? WHERE "users"."id" = ?  [["updated_at", "2020-09-17 13:45:51.944577"], ["remember_digest", "$2a$10$1CymqXEPzP.b05TblQ3Zye/ukhNblEpGlDxI4kT2VoiLUJK1EHVy2"], ["id", 102]]
   (0.0ms)  RELEASE SAVEPOINT active_record_1
=> true

Ainsi, chaque jeton ressemble à ceci. Le résumé est ci-dessus.

>> user.remember_token
=> "5dyf7BoW9H3H9SYH6VPRYg"
>> user.activation_token
=> "p5rorOE7trfF4L-YJynnxg"

2. En utilisant la méthode authenticated? Décrite dans le Listing 11.26, confirmons que l'authentification est réussie pour chaque combinaison token / digest. → Il suffit de vérifier ... Quoi? ?? NameError dans activation_token? ?? J'ai découvert et résolu le problème. Est-ce user.activation_token parce qu'il est lié à l'utilisateur jusqu'au dernier?

>> user.authenticated?(:remember, remember_token)
=> true
>> user.authenticated?(:activation, activation_token)
Traceback (most recent call last):
        1: from (irb):11
NameError (undefined local variable or method `activation_token' for main:Object)

Par conséquent, c'est vrai ci-dessous. Lors de la création de Remember_token, il était préférable de le lier avec user.remember_token au lieu de le définir nouvellement.

>> user.authenticated?(:activation, user.activation_token)
=> true

[11.3.2 Activer avec l'action d'édition Exercice]

  1. Depuis la console, vérifiez l'URL incluse dans l'e-mail généré en 11.2.4. Où dans l'URL le jeton d'activation est-il inclus? → Identique à l'exercice 1 de 11.2.4.

2. Collez l'URL que vous avez trouvée précédemment dans votre navigateur et vérifiez que l'utilisateur a été authentifié avec succès et peut être activé. Vérifiez également depuis la console que l'état d'activation est vrai. → L'authentification a réussi et activée.

[11.3.3 Test d’activation et refactorisation des mémos et exercices]

-Le tableau des livraisons qui apparaît dans le test est une variable. Donc, je l'ai effacé avec la configuration afin qu'il n'interfère pas avec d'autres tests. -Méthode de taille: identique à la méthode de longueur. Ici, le nombre d'emails (= 1) est confirmé. -Méthode Assigns: Vous pourrez accéder à la variable d'instance (@user) dans l'action correspondante (ici nous testons l'inscription, donc créez une action). -Where méthode: renvoie tous les enregistrements qui correspondent aux conditions données. Il y a eu une comparaison avec find et find_by ici.

  1. La méthode activate du Listing 11.35 appelle update_attribute deux fois, ce qui signifie qu'elle interroge la base de données une fois pour chaque ligne. Combinons les appels update_attribute en un seul appel update_columns en utilisant le modèle présenté dans le Listing 11.39 (cela vous permettra d'interroger la base de données une fois). Exécutez également le test après la modification et assurez-vous qu'il devient vert. → Ci-dessous

user.rb


  def activate
    update_columns(activated: true, activated_at: Time.zone.now)
  end

2. Actuellement, lorsque vous ouvrez la page d'index des utilisateurs de / users, tous les utilisateurs sont affichés et vous pouvez afficher des utilisateurs individuels en spécifiant un ID tel que / users /: id. Mais quand on y pense, cela n'a pas de sens de montrer aux utilisateurs qui ne sont pas valides. Modifions donc ce comportement en utilisant le modèle du Listing 11.40 9. L'enregistrement actif où la méthode utilisée ici sera expliquée un peu plus en détail au 13.3.3. → Ci-dessous

users_controller.rb


  def index
    @users = User.where(activated: true).paginate(page: params[:page])
  end
  
  def show
    @user = User.find(params[:id])
    redirect_to root_url and return unless @user.activated?
  end

3. Créons un test d'intégration pour / users et / users /: id pour tester le code modifié dans les exercices jusqu'à présent. La méthode de mise à jour saute sans effectuer de rappels ni de validations, alors soyez prudent si vous devez rappeler ou valider. → C'est difficile ici. L'idée est que "les utilisateurs non activés (@non_activated) ne sont pas affichés dans l'index" et que si vous essayez d'accéder à la page de l'utilisateur désactivé (user_path (@non_activated)), vous serez renvoyé à la maison. " J'ai juste besoin de m'assurer ... J'étais inquiet parce que je ne comprenais pas la première affirmation. Après tout, quand je l'ai vérifié, je devrais confirmer que "le lien de user_path (@non_activated) n'est pas affiché (il vaut 0)". Je vois. C'est donc ci-dessous. J'ai finalement ajouté le nom du test. De plus, j'ai ajouté @non_activated à la configuration après avoir réécrit le troisième utilisateur dans uses.yml sur enabled: false.

users_index_test.rb


  def setup
    @admin     = users(:michael)
    @non_admin = users(:archer)
    @non_activated = users(:lana)
  end

  test "index as admin including pagination and delete links, 
  not to show non activated user" do
    log_in_as(@admin)
    get users_path
    assert_template 'users/index'
    assert_select 'div.pagination'
    first_page_of_users = User.where(activated: true).paginate(page: 1)
    first_page_of_users.each do |user|
      assert_select 'a[href=?]', user_path(user), text: user.name
      assert_select 'a[href=?]', user_path(@non_activated), count: 0
      unless user == @admin
        assert_select 'a[href=?]', user_path(user), text: 'delete'
      end
    end
    assert_difference 'User.count', -1 do
      delete user_path(@non_admin)
    end
    get user_path(@non_activated)
    assert_redirected_to root_url
  end

[11.4 Envoi d'e-mails dans un environnement de production] Guchi et pratique]

** Enfin venu! !! SendGrid! !! ** ** N'est-ce pas terrible? Même si je m'inscris, mon compte sera gelé immédiatement et je ne pourrai pas ignorer les e-mails. Après avoir pris du temps pour ce type la dernière fois, il semble que je doive contacter le support pour le résoudre après tout, alors je l'ai laissé comme si je pouvais le faire. Ne l'utilisez pas pour un tel tutoriel ... J'ai donc essayé différentes méthodes pour introduire d'autres moyens, mais aucune d'elles n'a fonctionné ... Je ne suis pas satisfait, mais cette fois, je vais simplement utiliser sendgrid. Je laisserai cela comme une tâche future. ...... Après tout, il était gelé doucement. Ouais.

  1. Enregistrons-nous réellement en tant qu'utilisateur dans l'environnement de production. L'e-mail est-il arrivé à l'adresse e-mail que vous avez saisie lors de votre inscription en tant qu'utilisateur? → Ouais, c'était impossible.

2. Lorsque vous recevez l'e-mail, cliquez sur l'e-mail pour activer votre compte. Vérifiez également les journaux sur Heroku pour voir ce qu'il advient des journaux d'activation. Conseil: essayez d'exécuter la commande heroku logs depuis votre terminal. → Je veux le faire, mais je ne peux pas.

Résumé du chapitre 11

・ Si la fin est mauvaise, tout va mal. Je déteste SendGrid. ・ À l'avenir, j'aimerais travailler sur l'envoi de courrier uniquement avec Action Mailer. -Inclure le jeton d'activation et l'adresse e-mail d'échappement dans l'URL.

Je voulais résoudre le problème SendGrid d'une manière ou d'une autre ... C'est un gaspillage de passer plus de temps, alors je vais passer à autre chose. Je ferai certainement quelque chose dans le futur! Maintenant, voici le chapitre 12, réinitialisation du mot de passe. C'est le dernier chapitre du développement du système d'authentification!

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

Glossaire qui saisit en quelque sorte l'image

-Paramètres de requête Le point d'interrogation "?" Suivi de la paire clé / valeur à la fin de l'URL. Il est possible d'analyser d'où vient l'utilisateur (paramètre passif) et de modifier le contenu en fonction de la variable spécifiée (paramètre actif). Y compris toutes les requêtes Cliquez ici pour plus de détails.

・ CGI (Interface de passerelle commune) Un mécanisme dans lequel un serveur Web appelle un programme externe en réponse à une demande du navigateur Web du client, et le résultat de l'exécution est envoyé au navigateur Web du client via HTTP. Vous pouvez mettre en place des tableaux d'affichage, des compteurs d'accès, des formulaires de questionnaire, etc.

・ Assert_mutch Si la chaîne donnée correspond à l'expression canonique donnée, passez la vérification.

・ SMTP (protocole de transfert de courrier simple) Un protocole de transfert de courrier électronique sur Internet.

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]
[Tutoriel Rails Chapitre 5] Créer une mise en page
(Ruby on Rails6) Création de données dans une table
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
[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