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
をオーバーライドすると良いようです。