はじめに
最近、Deviseをいじる機会があったのでメモ。
やりたいこと
- Deviseのメール認証に成功した後に、管理者向けに「ユーザがメール認証したよ」的なメールを送信したい
send_user_confirmed_email
みたいな感じ
困ったこと
素直に実装すると、ユーザがURLをクリックするたびに管理者にメールが飛んでしまう。
実現方法1
resource.errors.empty?
で認証エラーがなければ、管理者にメール送信。
class Users::ConfirmationsController < Devise::ConfirmationsController def show # 略 super Users::Mailer.send_user_confirmed_email.deliver! if resource.errors.empty? # 略 end end
実現方法2(こっちのほうがよりスマート)
認証成功後に特定の処理を実行するには、after_confirmation
を使用する。
Userモデル内でオーバーライドすればOK。
class User < ApplicationRecord devise :database_authenticatable, :recoverable, :registerable, :confirmable, :trackable, :lockable, :validatable, :timeoutable, authentication_keys: [:login] # 略 def after_confirmation Users::Mailer.send_user_confirmed_email.deliver! end end