LoginSignup
78
47

More than 5 years have passed since last update.

ActionMailer Preview のススメ

Posted at

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 がプレビューである。中身を見てみよう。

spec/mailers/previews/sample_preview.rb
# Preview all emails at http://localhost:3000/rails/mailers/sample
class SamplePreview < ActionMailer::Preview

end

ActionMailer::Preview を継承したクラスであることが分かる。コメントにURLが書いてあるので、サーバーを立ち上げてアクセスしてみる。

スクリーンショット 2017-08-30 10.16.08.png

メールクラスの名前 "Sample" のみ表示されている。ここから内容を実装していく。

使い方

準備

プレビューの前にまずメールを実装する。シンプルにこんな感じ。

app/mailers/sample_mailer.rb
class SampleMailer < ApplicationMailer
  def welcome(member)
    @member = member
    mail to: @member.email, subject: 'Sample mailer'
  end
end
app/views/sample_mailer/welcome.text.erb
<%= @member.name_sei + ' ' + @member.name_mei %> 様

ご登録ありがとうございます。

プレビューの実装

プレビューには、メールオブジェクトを return するメソッドを実装する。シンプルな例だとこうなる。

spec/mailers/previews/sample_preview.rb
# 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にアクセスすると、項目が一つ増えている。

スクリーンショット 2017-08-30 12.30.46.png

リンクをクリックすると、メールの内容が確認できる。

スクリーンショット 2017-08-30 12.32.31.png

応用編

プレビューには、同じ(※)メーラーを呼び出す別のメソッドが定義されていてもよい。条件によって内容が変わるメールだと重宝する。
※違うメーラーを呼び出してもいいのだが、混乱の元なのでお勧めしない。
また、seedデータがあればそれも利用できる。

spec/mailers/previews/sample_preview.rb
# 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

スクリーンショット 2017-08-30 12.36.30.png

使い所

メールを送る条件が複雑な場合、画面操作をすっ飛ばしてメールの内容が確認できる。これは letter_opener にない利点である。

  • 項目の多い入力フォームを埋めて submit しなければ送信されないメール
  • rake task で送信されるメール
  • 特定の条件を満たす宛先にのみ送信されるメール etc...

特に業務システムの場合、メールの活躍機会はまだまだ多いはず。うまく使えば確認作業が大幅に楽になる ActionMailer::Preview をぜひ活用しよう。

78
47
1

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
78
47