📨

Railsのメールプレビュー画面をカスタマイズする方法

2021/05/30に公開

はじめに

アプリケーションから送信されるメールの内容をエンジニア以外でも簡単に確認できるようにして欲しいという要望に対して、Action Mailerのプレビュー機能を使うことは多いかと思います。
ただし一覧画面に表示されるのはクラス名とメソッド名のみというシンプルな仕様なので、メールの種類が増えてくると内容を把握しにくくなることが難点です。
メソッド名を日本語にすることである程度はカバー出来るのですが、例えば実際に送信されたメールと照合しやすくするために件名も併記してほしい等の要望が出てくると、メソッド名だけでカバーするのはなかなか辛くなってくると思います。
そこでデフォルトで用意されているメールプレビュー用のテンプレートを上書きするための方法を紹介します。

設定方法

config/initializers/mailer_previews.rb
if Rails.env.development?
  Rails.configuration.to_prepare do
    module CustomPreviewMailerController
      def self.prepended(base)
       # 環境に応じてパスは書き換えてください
        base.prepend_view_path Rails.root.join('spec/mailers/previews')
      end
    end

    ::Rails::MailersController.prepend CustomPreviewMailerController
  end
end

上記設定の場合、spec/mailers/previews/rails/mailersにテンプレートを設置することで上書き可能となります。
デフォルトで用意されているテンプレートはhttps://github.com/rails/rails/tree/main/railties/lib/rails/templates/rails/mailersから確認できます。

I18nで設定された件名を併記するように書き換えた例

index.html.erb
<% @previews.each do |preview| %>
<h3><%= link_to preview.preview_name.titleize, url_for(controller: "rails/mailers", action: "preview", path: preview.preview_name) %></h3>
<ul>
<% preview.emails.each do |email| %>
<li>
  <%= link_to email, url_for(controller: "rails/mailers", action: "preview", path: "#{preview.preview_name}/#{email}") %>
  <i style="color:#6c757d"><%= t(:subject, scope: [preview.preview_name, email], default: email) %></i>
</li>
<% end %>
</ul>
<% end %>

Image from Gyazo

おわりに

テンプレートやコントローラーの処理をカスタマイズすることで、要件に応じてメールプレビュー画面の使い勝手を上げられるのではないかと思います。

参考記事

Discussion