2011-11-04 53 views
15

現在,據我所知,即使模型未通過驗證,也會調用after_validation。有沒有辦法只在模型有效時才調用它?我嘗試在after_validation方法中添加return false unless self.valid?,但它再次觸發驗證,並創建一個無限循環。Ruby on Rails - after_validation如果有效?

+2

那麼,你可以檢查'錯誤',比如'返回false,除非self.errors.empty?'或'返回false如果errors.any?'。 – tbuehlmann

回答

16

的失敗驗證,添加到該記錄中的錯誤,所以你可以只檢查:

return false unless self.errors.empty? 
+0

我以前曾嘗試過,但仍然失敗。然後我檢查了代碼,我發現我再次調用驗證(當我不應該)時。現在它運作完美。謝謝! –

2

你有沒有想過使用before_save回調呢?

我相信只有在對象有效時纔會調用它。

+2

如果我不想保存它,該怎麼辦?只想驗證它? –

+1

你也不能在'before_save'中做更高級的事情,就像檢查一個關聯中改變了哪些字段(通過'xxx_changed?'),因爲關聯首先被更新,從而重置'changed'哈希值。因此,有必要在'after_validation'中執行這些檢查作爲解決方法。 –

0

我知道這是一個老問題,但我在模型中使用自定義驗證時,碰到了同樣的錯誤我創造了。查看docs有一個覆蓋自定義方法的部分,它聲明每次使用.valid?方法時都會調用這種驗證。這可能是爲什麼當觸發:after_validation回調時觸發無限循環。