紙一重の積み重ね

35歳のエンジニアがなれる最高の自分を目指して、学んだことをこつこつ情報発信するブログです。

【Devise】ユーザのメール認証が成功した際に、管理者向けにメール送信処理を組み込む方法 #ruby #Rails

f:id:yokoyantech:20190319153636p:plain

はじめに

最近、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を使用する。

github.com

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