Madogiwa Blog

主に技術系の学習メモに使っていきます。

Ruby on Rails: メーラー関連のファイルを`app/mailers`に集約するメモ📝

Ruby on RailsメーラーのViewはデフォルトでapp/views配下に置かれてしまい数が多くなってくるとControllerからrenderされるものとMailerからrenderされるものが混在してしまい見通しが悪くなるケースがあります。

メーラーのビューは app/views/name_of_mailer_class ディレクトリに置かれます。
Action Mailer の基礎 - Railsガイド

そういうわけでメーラー関連のファイルはapp/mailers配下に集約する方法をメモ📝

やり方

目指す姿は以下のような感じで、mailer配下にviewsを持ち、そこにlayoutや各mailerのviewを配置することを目指します。

app/mailers
├── application_mailer.rb
├── sample_mailer.rb
└── views
    ├── layouts
    │   ├── application_mailer.html.erb
    │   └── application_mailer.text.erb
    └── sample_mailer
        ├── sample_mail.html.erb
        └── sample_mail.text.erb

やり方は、そこまで難しくなくて以下のようなApplicationMailerを用意してあげるだけで大丈夫でした!

class ApplicationMailer < ActionMailer::Base
  default from: "from@example.com"
  layout Rails.root.join("app/mailers/views/layouts/application_mailer")
  prepend_view_path "app/mailers/views"
end

layout Rails.root.join("app/mailers/views/layouts/application_mailer")app/mailers内のlayout用のファイルを参照するようにし、

別のレイアウトファイルを明示的に指定したい場合は、メーラーでlayoutを呼び出します。
Action Mailer の基礎 - Railsガイド

prepend_view_path "app/mailers/views"でviewの参照パスにapp/mailers/viewsを追加しています。

prepend_view_pathメソッドやappend_view_pathメソッドを用いることで、パスの解決時に優先して検索される別のディレクトリを追加できます。
Action View の概要 - Railsガイド

参考

techracho.bpsinc.jp