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
正しくテストが行われるために
テスト環境のドメインホストを設定する必要がある
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)となる