如何讓使用者完成註冊確認之後就做某件事
2015-01-21 21:52:35

問題

我們希望能在一個使用者帳號被建立的時候初始化一些資料,最好的時間點就是當使用者完成註冊確認的時候。

解法

devise在3.1.2之後在Devise::Confirmable有提供一個method叫after_confirmation。你可以override它如下:

class User < ActiveRecord::Base
  devise :database_authenticatable, :registerable,
     :recoverable, :rememberable, :trackable, :validatable, :confirmable

  def after_confirmation
    # do something...
  end
end

不過這樣的做法有個缺點就是每次使用者更改email重新做confirmation的時候都會再做一次,這顯然不是我們想要的。比較好的做法是overrideconfirm!這個method,並且在method中檢查confirmed_at是否已經存在過來判斷是不是第一次做confirmation,程式如下:

class User < ActiveRecord::Base
  devise :database_authenticatable, :registerable,
     :recoverable, :rememberable, :trackable, :validatable, :confirmable

  def confirm!
    super
    if first_confirmation?
      # do something...
    end
  end

  private

  def first_confirmation?
    previous_changes[:confirmed_at] && previous_changes[:confirmed_at].first.nil?
  end
end

Refs