Railsでメールを送信するためには ActionMailer という機能がある。内容の確認には letter_opener などの素晴らしいGemがある他、テストも作成できる。ここではメールの内容を確認するためのもう一つの方法、 ActionMailer::Preview
(以下単に「プレビュー」)を紹介する。
作成
特別なコマンドはなく、 rails generate mailer の時に同時に作成される。
$ rails g mailer sample
create app/mailers/sample_mailer.rb
invoke slim
create app/views/sample_mailer
invoke rspec
create spec/mailers/sample_spec.rb
create spec/mailers/previews/sample_preview.rb
この中の spec/mailers/previews/sample_preview.rb
がプレビューである。中身を見てみよう。
# Preview all emails at http://localhost:3000/rails/mailers/sample
class SamplePreview < ActionMailer::Preview
end
ActionMailer::Preview を継承したクラスであることが分かる。コメントにURLが書いてあるので、サーバーを立ち上げてアクセスしてみる。
メールクラスの名前 "Sample" のみ表示されている。ここから内容を実装していく。
使い方
準備
プレビューの前にまずメールを実装する。シンプルにこんな感じ。
class SampleMailer < ApplicationMailer
def welcome(member)
@member = member
mail to: @member.email, subject: 'Sample mailer'
end
end
<%= @member.name_sei + ' ' + @member.name_mei %> 様
ご登録ありがとうございます。
プレビューの実装
プレビューには、メールオブジェクトを return するメソッドを実装する。シンプルな例だとこうなる。
# Preview all emails at http://localhost:3000/rails/mailers/sample
class SamplePreview < ActionMailer::Preview
def welcome
member = Member.new(name_sei: '菅田', name_mei: '将暉', email: 'suda@example.com')
SampleMailer.welcome(member)
end
end
先ほどのURLにアクセスすると、項目が一つ増えている。
リンクをクリックすると、メールの内容が確認できる。
応用編
プレビューには、同じ(※)メーラーを呼び出す別のメソッドが定義されていてもよい。条件によって内容が変わるメールだと重宝する。
※違うメーラーを呼び出してもいいのだが、混乱の元なのでお勧めしない。
また、seedデータがあればそれも利用できる。
# Preview all emails at http://localhost:3000/rails/mailers/sample
class SamplePreview < ActionMailer::Preview
def welcome
member = Member.new(name_sei: '菅田', name_mei: '将暉', email: 'suda@example.com')
SampleMailer.welcome(member)
end
def welcome_db
member = Member.first
SampleMailer.welcome(member)
end
end
使い所
メールを送る条件が複雑な場合、画面操作をすっ飛ばしてメールの内容が確認できる。これは letter_opener にない利点である。
- 項目の多い入力フォームを埋めて submit しなければ送信されないメール
- rake task で送信されるメール
- 特定の条件を満たす宛先にのみ送信されるメール etc...
特に業務システムの場合、メールの活躍機会はまだまだ多いはず。うまく使えば確認作業が大幅に楽になる ActionMailer::Preview
をぜひ活用しよう。