2014-09-24 61 views
0

如果我有這樣一些創造行動之前:軌道4:活動記錄驗證錯誤的:創建

before_create :generate_token 
private 
def generate_token 
    self.auth_token = loop do 
    random_token = SecureRandom.urlsafe_base64(nil, false) 
    break random_token unless self.class.exists?(auth_token: random_token) 
    end 
end 

當寫驗證我發現validates :auth_token, presence: true, on: :create失敗。 但是,validates :auth_token, presence: true, on: :after_create的作品。

這是爲什麼?

ref。 Active Record Callback OrderActive Record Validations :on

編輯:奇怪的是,on: :before_create通過驗證,on: :create失敗,on: after_create成功。這是令人費解的,有人可以解釋一下嗎?

回答

0

閱讀您鏈接到文檔:

(1) before_validation 

(-) validate <======== This runs before before_create callbacks are run 

(2) after_validation 

(3) before_save 

(4) before_create 

我會考慮生成令牌時初始化對象。

after_initialized :generate_token 
+0

我鏈接到兩個文檔,你指的是?後者解釋了「:on選項允許你指定何時進行驗證」。 我很欣賞你的建議,不幸的是你的回答很混亂,也毫無幫助。你指出我在OP中沒有提到的before_create狀態。 – gr8scott06 2014-09-25 01:03:12

+0

假設我這樣做了,並且推斷出你的point-arrow響應轉化爲「驗證失敗,因爲'validate'在活動記錄對象的生命週期中比'before_create'更早發生'」,那麼你的結論仍然是無效的: – gr8scott06 2014-09-25 01:04:10

+0

你上面的邏輯意味着「驗證[也]在create和after_create回調運行之前運行」(after_create在創建之後發生,兩者都在生命週期中驗證之後發生)。 因此,如果before_create失敗,那麼after_create應該失敗,如果(某種程度上)after_create通過了,那麼創建也應該通過。 – gr8scott06 2014-09-25 01:05:34