0
0

More than 3 years have passed since last update.

11.2 アカウント有効化のメール送信: Railsチュートリアル備忘録 - 第11章

Last updated at Posted at 2020-06-18

11.2 アカウント有効化のメール送信

11.2.1 送信メールのテンプレート

rails generateでメイラーを生成可能
(password_resetはあとで使う)

$ rails generate mailer UserMailer account_activation password_reset 

生成物が以下

      create  app/mailers/user_mailer.rb # ここにアクションのようなものを定義する
      invoke  erb
      create    app/views/user_mailer
      create    app/views/user_mailer/account_activation.text.erb # メールのレイアウト(テキスト)
      create    app/views/user_mailer/account_activation.html.erb # メールのレイアウト(html)

レイアウトにはERBが使える
つまりインスタンス変数urlヘルパーedit_account_activation_urlが呼べる

edit_account_activation_url(@user.activation_token, email: @user.email)

と2つ引数を取ると
以下のようなパスを返す

/account_activations/(第1引数)/edit?(第2引数)

?以下はクエリパラメータと呼ばれ
?email=...とキーと値のペアで記述される
このときURL表記に使えない記号は自動的にエスケープしてくれる

ビューファイルは上記urlヘルパーが埋め込まれるようにする

ビューファイルで使用するインスタンス変数送信先タイトル
app/mailers/user_mailer.rb`に定義する

  def account_activation(user)
    @user = user
    mail to: user.email, subject: "Account activation"
  end

11.2.2 送信メールのプレビュー

手順どおりすすむと
ブラウザでプレビューできるようになる

11.2.3 送信メールのテスト

以下にすでにテストが記述されているのが
$ rails test > (RED)の原因

test/mailers/user_mailer_test.rb
require 'test_helper'

class UserMailerTest < ActionMailer::TestCase
  test "account_activation" do
    mail = UserMailer.account_activation
    assert_equal "Account activation", mail.subject
    assert_equal ["to@example.org"], mail.to
    assert_equal ["from@example.com"], mail.from
    assert_match "Hi", mail.body.encoded
  end
.
.
.
end

正しくテストが行われるために
テスト環境のドメインホストを設定する必要がある

config/environments/test.rb
Rails.application.configure do
  .
  .
  .
  config.action_mailer.delivery_method = :test
  config.action_mailer.default_url_options = { host: 'example.com' } #テスト環境のホストを設定
  .
  .
  .
end

$ rails test > (GREEN)となるはずですが
password_resetのほうがfailureのまま

    assert_equal ["noreply@example.com"], mail.from

を修正したら

$ rails test > (GREEN)となりました

11.2.4 ユーザーのcreateアクションを更新

createアクションを変更

  • UserMailer.account_activation(@user)でメールを送信
  • flashメッセージを変更
  • この時点でログインしないようにする
  • リダイレクト先を変更
    def create
    @user = User.new(user_params)
    if @user.save
      UserMailer.account_activation(@user).deliver_now
      flash[:info] = "Please check your email to activate your account."
      redirect_to root_url
    else
      render 'new'
    end
  end

挙動が変わるので$ rails test > (RED)となる

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0