らくだ🐫にもできるRailsチュートリアル|12.2
※毎回書いたほうがいい気がするので書いておきます※
平文の部分をI18nでちょこちょこ日本語化しているのですが
その部分に関しては特に記述していなくてもたまにコードが違ったりしています。
t(‘.hogehoge’)って部分です
どうぞお気になさらず。
12.2 パスワード再設定のメール送信
パスワードの再設定に関するメールの部分を作っていく
11章でUserメイラーを生成した際にデフォルトのpassword_resetメソッドなどもまとめて生成されているので
それを使って定義していく!
12.2.1 パスワード再設定のメールとテンプレート
11.3.3で行ったリファクタリングと同様の作業を行っていく
最初にUserメイラーにpassword_resetメソッドを作成し (リスト 12.7)、続いて、テキストメールのテンプレート (リスト 12.8) とHTMLメールのテンプレート (リスト 12.9) をそれぞれ定義します。
Userメイラーにpassword_resetメソッドを作成
class UserMailer < ApplicationMailer def account_activation(user) # インスタンス変数を定義 @user = user # user.emailにタイトルが"t('.account_activation_title')"のメールを送信 mail to: user.email, subject: t('.account_activation_title') end def password_reset(user) # インスタンス変数を定義 @user = user # user.emailにタイトルが"t('.password_reset')"のメールを送信 mail to: user.email, subject: t('.password_reset') end end
パスワード再設定のテンプレート (テキスト)
<%= t('user_mailer.click_the_link') %> <%= edit_password_reset_url(@user.reset_token, email: @user.email) %> <%= t('user_mailer.expire_in_two_hours') %> <%= t('user_mailer.ignore_this_email') %>
パスワード再設定のテンプレート (HTML)
<h1><%= t('.reset_msg') %></h1> <p><%= t('user_mailer.click_the_link') %></p> <%= link_to t('.reset_msg'), edit_password_reset_url(@user.reset_token, email: @user.email) %> <p><%= t('user_mailer.expire_in_two_hours') %></p> <p><%= t('user_mailer.ignore_this_email') %></p>
プレビューも見られるように設定
# Preview all emails at http://localhost:3000/rails/mailers/user_mailer class UserMailerPreview < ActionMailer::Preview # Preview this email at # https://5f7b98a0b66149149ecd6edabf11f3d6.vfs.cloud9.ap-northeast-1.amazonaws.com/rails/mailers/user_mailer/account_activation def account_activation # userにDBの1番目のユーザーを代入 user = User.first # userのactivation_tokenに新しい有効化トークンを代入 user.activation_token = User.new_token # UserMailerクラスのaccount_activationメソッドを呼び出し(引数にuserを渡す) UserMailer.account_activation(user) end # Preview this email at # https://5f7b98a0b66149149ecd6edabf11f3d6.vfs.cloud9.ap-northeast-1.amazonaws.com/rails/mailers/user_mailer/password_reset def password_reset # userにDBの一番目のユーザーを代入 user = User.first # userのreset_tokenに新しい有効化トークンを代入 user.reset_token = User.new_token # UserMailerクラスのpassword_resetメソッドを呼び出し(引数にuserを渡す) UserMailer.password_reset(user) end end
16行目のアドレスにアクセスするとプレビューを確認できる
→できる!
実際の動作を確認
日本語のままだと化けるので/sample_app/config/application.rbで言語をenにしておく
config.i18n.default_locale = :en
パスワードの再設定フォームに正しいアドレスを入力してボタンを押すとこうなる
(メールを確認してねって感じのフラッシュメッセージが表示されているはずだけどI18nで英語の設定してないから翻訳エラーな文章)
サーバーのログはこうなる
(I18nで英語の設定してないから略)
Sent mail to example@railstutorial.org (7.7ms) Date: Thu, 23 Apr 2020 14:50:07 +0900 From: noreply@example.com To: example@railstutorial.org Message-ID: <5ea12c8f8cdf2_1e1b1ec0f4431668@ip-172-31-40-65.mail> Subject: translation missing: en.user_mailer.password_reset.password_reset_title Mime-Version: 1.0 Content-Type: multipart/alternative; boundary="--==_mimepart_5ea12c8f8b8b4_1e1b1ec0f4431542"; charset=UTF-8 Content-Transfer-Encoding: 7bit ----==_mimepart_5ea12c8f8b8b4_1e1b1ec0f4431542 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit <span class="translation_missing" title="translation missing: en.user_mailer.click_the_link">Click The Link</span> https://5f7b98a0b66149149ecd6edabf11f3d6.vfs.cloud9.ap-northeast-1.amazonaws.com/password_resets/qT0cwyy9La2jniwmC_0aTA/edit?email=example%40railstutorial.org <span class="translation_missing" title="translation missing: en.user_mailer.expire_in_two_hours">Expire In Two Hours</span> <span class="translation_missing" title="translation missing: en.user_mailer.ignore_this_email">Ignore This Email</span> ----==_mimepart_5ea12c8f8b8b4_1e1b1ec0f4431542 Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: 7bit <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <style> /* Email styles need to be inline */ </style> </head> <body> <h1><span class="translation_missing" title="translation missing: en.user_mailer.password_reset.reset_msg">Reset Msg</span></h1> <p><span class="translation_missing" title="translation missing: en.user_mailer.click_the_link">Click The Link</span></p> <a href="https://5f7b98a0b66149149ecd6edabf11f3d6.vfs.cloud9.ap-northeast-1.amazonaws.com/password_resets/qT0cwyy9La2jniwmC_0aTA/edit?email=example%40railstutorial.org"><span class="translation_missing" title="translation missing: en.user_mailer.password_reset.reset_msg">Reset Msg</span></a> <p><span class="translation_missing" title="translation missing: en.user_mailer.expire_in_two_hours">Expire In Two Hours</span></p> <p><span class="translation_missing" title="translation missing: en.user_mailer.ignore_this_email">Ignore This Email</span></p> </body> </html> ----==_mimepart_5ea12c8f8b8b4_1e1b1ec0f4431542--
演習
- ブラウザから、送信メールのプレビューをしてみましょう。「Date」の欄にはどんな情報が表示されているでしょうか?
- パスワード再設定フォームから有効なメールアドレスを送信してみましょう。また、Railsサーバーのログを見て、生成された送信メールの内容を確認してみてください。
- コンソールに移り、先ほどの演習課題でパスワード再設定をしたUserオブジェクトを探してください。オブジェクトを見つけたら、そのオブジェクトが持つreset_digestとreset_sent_atの値を確認してみましょう。
- 再設定フォームの送信ボタンを押した日時
- emailと再設定トークンの値を持ったURLが記載されたメール(textとHTML)が送信されている
- reset_digest → 値が入っている
reset_sent_at → 再設定フォームの送信ボタンを押した日時の値が入っている
12.2.2 送信メールのテスト
メイラーメソッドのテスト
(再設定の時とほぼ同じ→本文へのテストも同じくtextとHTMLで分ける)
(言語はjaに戻しておく)
・ ・ ・ test "password_reset" do user = users(:michael) user.reset_token = User.new_token mail = UserMailer.password_reset(user) assert_equal "Sample App アカウント再設定メール", mail.subject assert_equal [user.email], mail.to assert_equal ["noreply@example.com"], mail.from assert_match user.reset_token, mail.text_part.body.encoded assert_match user.reset_token, mail.html_part.body.encoded assert_match CGI.escape(user.email), mail.text_part.body.encoded assert_match CGI.escape(user.email), mail.html_part.body.encoded end end
演習
- メイラーのテストだけを実行してみてください。このテストは greenになっているでしょうか
- リスト 12.12にある2つ目のCGI.escapeを削除すると、テストが redになることを確認してみましょう
- GREEN
- RED
まとめとか感想
(おうちの都合で)間は結構空いちゃったけど、内容は割とさっくり。
実際本文も短めですもんね。
なるべくサクサク進みたい!と思っています!!
らくだ🐫にもできるRailsチュートリアルとは
「ド」が付く素人のらくだ🐫が勉強するRailsチュートリアルの学習記録です。
自分用に記録していますが、お役に立つことがあれば幸いです。
調べたとはいえらくだ🐫なりの解釈や説明が含まれます。間違っている部分もあるかと思います。そんな所は教えて頂けますと幸いなのですが、このブログにはコメント機能がありません💧お手数おかけしますがTwitterなどでご連絡いただければ幸いです