Devise 4.8.0 でメールテンプレートを変更したい場合、カスタムメーラーの template_path ではなく headers_for をオーバーライドする

Rails + Deviseにて、Devise標準のメール受信確認用メールテンプレートを差し替えたいことがありました。

 
そこで Devise の Wiki How To: Use custom mailer · heartcombo/devise Wiki に従い、

% bin/rails g devise:views users
...
      create    app/views/users/mailer/confirmation_instructions.html.erb

と View を生成した後、 confirmation_instructions.html.erb

<p>Welcome <%= @email %>!</p>

<p>You can confirm your account email through the link below:</p>

<p><%= link_to 'Confirm my account', confirmation_url(@resource, confirmation_token: @token) %></p>

<%# 以下を追加 %>
<p>token => <%= @token %></p>

と変更した上、カスタムメーラー app/mailers/devise_my_mailer.rb

class DeviseMyMailer < Devise::Mailer
  default template_path: 'users/mailer'
end

と定義し、合わせて config/initializer/devise.rb

Devise.setup do |config|
# ...
  config.mailer = 'DeviseMyMailer'
# ...
end

と編集しました。

 
その後、confirmableモジュールを有効にしたRails + Deviseを起動し、ユーザー登録時のメール受信確認を行ったところ、到着したメールには

と、追加したはずのトークンの記載がありませんでした。 template_path で設定したテンプレートではなく Devise 標準のメールテンプレートが使われているように見えました。

そこで調べた時のメモを残します。

 

環境

  • Rails 6.1.3.2
  • Devise 4.8.0

 

対応

issueがありました。
Unable to use custom views for emails · Issue #4842 · heartcombo/devise

また、以下の記事にも解説がありました。
週刊Railsウォッチ(20180820)Railsで構築されたサイト40選、Deviseはつらいよ、ARのスコープとクラスメソッドの使い分けほか|TechRacho(テックラッチョ)〜エンジニアの「?」を「!」に〜|BPS株式会社

 
そこで、issueに従ってカスタムメーラー app/mailers/devise_my_mailer.rb

class DeviseMyMailer < Devise::Mailer
  # これでは動かない
  # https://github.com/heartcombo/devise/issues/4842
  # default template_path: 'users/mailer'

  def headers_for(action, opts)
    super.merge!(template_path: 'users/mailer')
  end
end

として、再度ユーザー登録時のメール受信確認を行ったところ、到着したメールは想定通り

となっていました。

 
現時点では template_path ではなく headers_for をオーバーライドすると良いようです。