Action Mailerのtemplateを意図的に変更する方法
railsでAction Mailerを使っていて、メールのテンプレートを条件分岐で一部変更したい、なんてときに使える方法。
メール送信クラスからmail
メソッドを実行するときにtemplate_path
とtemplate_name
の引数に具体的な格納先を指定すればOK。
例えばapp/mailers/hello_mailer.rb
というクラスがあって、以下のようなコードになっている場合。
class HelloMailer < ApplicationMailer
def mail_to_user(user_id)
@user = User.find(user_id)
mail(to: @user.email, subject: 'こんにちは!')
end
end
テンプレートの場所はデフォルトだとapp/views/hello_mailer/mail_to_user.text.erb
みたいになる。
このテンプレートの場所をapp/views/mails/hello_mailer/hello_hello.text.erb
にしたいときは以下のようにオプションを指定すればOK。
views
から下のディレクトリをtemplate_path
に指定して、ファイル名はtemplate_name
に指定する。
class HelloMailer < ApplicationMailer
def mail_to_user(user_id)
@user = User.find(user_id)
mail(to: @user.email, subject: 'こんにちは!', template_path: 'mails/hello_mailer', template_name: 'hello_hello')
end
end
もちろん以下のようにifで内部的に分岐してもOK。
余談だけど、メールは誤送信とかしたときのリカバリが高コストなこともあり、分岐をしたら分岐ごとにテストコードを書いておきたい。
class HelloMailer < ApplicationMailer
def mail_to_user(user_id)
@user = User.find(user_id)
if @user.special?
mail(to: @user.email, subject: 'あなただけに特別なお知らせ!', template_path: 'mails/hello_mailer', template_name: 'hello_hello')
else
mail(to: @user.email, subject: 'こんにちは!')
end
end
end
テンプレートを内部処理で分岐させたいときにも有効なんだけど、メールの種類が増えてきたときにviews
直下にmailerごとのディレクトリがあるとごちゃついて嫌になるときがある。
そんなときはメール用のディレクトリとしてviews/mails
みたいのを作って、そこにmailerごとにディクレトリ&ファイルを置いておくとわかりやすくて管理しやすくなっておすすめ。
この記事の環境情報
- Ruby on Rails 7.0.4
- actionmailer 7.0.4
- バナナを買い忘れた
railsに関する他の記事を読む
- omniauth-google-oauth2でscopeを追加するときはemailが必須だった
- google-api-clientを指定してinstallするのはもう非推奨になっていた
- OmniAuthでdeveloper providerを使ってダミーログインをする
- [Rails]取得したクラス名をキャメルケースからスネークケースに変換する
- urlヘルパーをモデルなどでも使う方法
最近の記事を読む
- Flutterでcontextを使わずにlocale情報を取得する
- Cloud RunでIAPを有効にしようとしてハマったこと
- slimでtype='application/ld+json'のscriptタグを書く
- タグマネージャーでjsのloadイベントを発火させたいとき
- mysqlコマンドを実行してERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)と言われたら