らくだ🐫にもできる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)

<%= t('.reset_msg') %>

<%= t('user_mailer.click_the_link') %>

<%= link_to t('.reset_msg'), edit_password_reset_url(@user.reset_token, email: @user.email) %>

<%= t('user_mailer.expire_in_two_hours') %>

<%= t('user_mailer.ignore_this_email') %>

プレビューも見られるように設定

# 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

Click The Link

https://5f7b98a0b66149149ecd6edabf11f3d6.vfs.cloud9.ap-northeast-1.amazonaws.com/password_resets/qT0cwyy9La2jniwmC_0aTA/edit?email=example%40railstutorial.org

Expire In Two Hours

Ignore This Email

----==_mimepart_5ea12c8f8b8b4_1e1b1ec0f4431542
Content-Type: text/html;
 charset=UTF-8
Content-Transfer-Encoding: 7bit

<!DOCTYPE html>

  
    
    
  

  
    

Reset Msg

Click The Link

Reset Msg

Expire In Two Hours

Ignore This Email

----==_mimepart_5ea12c8f8b8b4_1e1b1ec0f4431542--

演習

  1. ブラウザから、送信メールのプレビューをしてみましょう。「Date」の欄にはどんな情報が表示されているでしょうか?
  2. パスワード再設定フォームから有効なメールアドレスを送信してみましょう。また、Railsサーバーのログを見て、生成された送信メールの内容を確認してみてください。
  3. コンソールに移り、先ほどの演習課題でパスワード再設定をしたUserオブジェクトを探してください。オブジェクトを見つけたら、そのオブジェクトが持つreset_digestとreset_sent_atの値を確認してみましょう。
  1. 再設定フォームの送信ボタンを押した日時
  2. emailと再設定トークンの値を持ったURLが記載されたメール(textとHTML)が送信されている
  3. 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

演習

  1. メイラーのテストだけを実行してみてください。このテストは greenになっているでしょうか
  2. リスト 12.12にある2つ目のCGI.escapeを削除すると、テストが redになることを確認してみましょう
  1. GREEN
  2. RED

まとめとか感想

(おうちの都合で)間は結構空いちゃったけど、内容は割とさっくり。 実際本文も短めですもんね。 なるべくサクサク進みたい!と思っています!!

らくだ🐫にもできるRailsチュートリアルとは

「ド」が付く素人のらくだ🐫が勉強するRailsチュートリアルの学習記録です。 自分用に記録していますが、お役に立つことがあれば幸いです。

調べたとはいえらくだ🐫なりの解釈や説明が含まれます。間違っている部分もあるかと思います。そんな所は教えて頂けますと幸いなのですが、このブログにはコメント機能がありません💧お手数おかけしますがTwitterなどでご連絡いただければ幸いです

タグ: Railsチュートリアル、らくだにも出来るRailsチュートリアル