17
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【devise】新規登録とメールアドレス変更で異なるテンプレートを使用する

Posted at

はじめに

deviseでメールアドレス変更を行おうとすると、デフォルトでは認証メールは新規登録と同じテンプレートを使用する様になっていました。
しかし、新規登録とメールアドレス変更でメールの内容を変更したい。試行錯誤して設定を行ったので、備忘録に。

テンプレート変更の設定にフォーカスした内容になっていますので、deviseでのメールアドレス変更の基本的な詳しい設定方法は他の記事をご覧ください。
私はrails deviceを使用したメールアドレス変更を参考にしました。

環境

  • rails 7
  • devise導入済み
  • メール認証を含む新規登録〜ログイン
  • メールアドレス変更実装済み

やり方

deviseをオーバーライドしてメールアドレス変更用の認証メールのconfirmation_on_edit_address_instructionsを追加する

app/controllers/users/answers_controller.rb
if defined?(ActionMailer)
  class Devise::Mailer < Devise.parent_mailer.constantize
      include Devise::Mailers::Helpers
  
      def confirmation_instructions(record, token, opts={})
        @token = token
        devise_mail(record, :confirmation_instructions, opts)
      end
  
      def reset_password_instructions(record, token, opts={})
        @token = token
        devise_mail(record, :reset_password_instructions, opts)
      end
  
      def unlock_instructions(record, token, opts={})
        @token = token
        devise_mail(record, :unlock_instructions, opts)
      end
  
      def confirmation_on_edit_address_instructions(record, token, opts={})
        @token = token
        devise_mail(record, :confirmation_on_edit_address_instructions, opts)
      end
   end
end

追加したconfirmation_on_edit_address_instructionsをメールアドレス変更時に送信する様にdeviseのsend_reconfirmation_instructionsをオーバーライドする。

app/models/user.rb
  def send_reconfirmation_instructions
    @reconfirmation_required = false
    unless @skip_confirmation_notification
      send_on_edit_address_confirmation_instructions
    end
  end

  def send_on_edit_address_confirmation_instructions
    unless @raw_confirmation_token
      generate_confirmation_token!
    end
    opts = pending_reconfirmation? ? { to: unconfirmed_email } : { }
    send_devise_notification(:confirmation_on_edit_address_instructions, @raw_confirmation_token, opts)
  end

confirmation_on_edit_address_instructionsのviewはこんな感じ。

app/views/users/mailer/confirmation_on_edit_address_instructions.html.erb
<div>
  <p>※本メールは、自動的に配信しています。
  こちらのメールは送信専用のため、直接ご返信いただいてもお問合せにはお答えできませんので、あらかじめご了承ください。</p>

  <p>以下のURLよりメールアドレスの変更手続きを完了してください。</p>

<p><%= link_to 'メールアドレスを変更する', confirmation_address_url(@resource, confirmation_token: @token) %></p>

ルーティングにトークンを設定

config/routes.rb
get 'users/confirm_address/:confirmation_token', :to => "users/confirmations#confirmation_address", :as => "confirmation_address", :only_path => false
app/controllers/users/confirmations_controller.rb
  def confirmation_address
    self.resource = resource_class.confirm_by_token(params[:confirmation_token])
    yield resource if block_given?

    if resource.errors.empty?
      redirect_to after_address_hoge_path
    else
      sign_out
      redirect_to fuga_path, flash: { alert: '無効なURLです。' }
    end
  end

最後に

プログラミング学習中の初学者です。
内容の誤りや他に良い方法があれば、コメント等で教えていただけると幸いです。

参考記事

rails deviceを使用したメールアドレス変更
Deviseで新規登録時とメールアドレス変更時のテンプレートを分ける

17
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
17
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?