Help us understand the problem. What is going on with this article?

ActionMailer Preview のススメ

More than 1 year has passed since last update.

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 をぜひ活用しよう。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした