・ 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.
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.
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.
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.
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
>> CGI.escape('[email protected]')
=> "foo%40example.com"
>> CGI.escape("Don't panic!")
=> "Don%27t+panic%21"
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.
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é.
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.
delivery_now: Comme son nom l'indique, le processus d'envoi de courrier est exécuté à ce moment.
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.
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.
>> 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
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.
-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.
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
** 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.
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.
・ 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
-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