2011-12-06 87 views
2

這是我的模型:爲什麼我的自定義驗證在Rails中運行?

class Goal < ActiveRecord::Base 

    belongs_to :user 

    validate :progress_is_less_than_max 

    private 
    def progress_is_less_than_max 
     if progress > max 
     errors.add(:progress, "should be less than max") 
     end 
    end 

end 

如果我進入控制檯,並做

some_user.goals.create! :name => 'test', :max => 10, :progress => 15, :unit => 'stuff' 

它保存得很好,沒有任何錯誤。我不正確的是什麼?

+0

請問您的用戶'has_many'目標是什麼?也就是說,你是否明確指定了與用戶模型中的'has_many'方法的關聯? – maprihoda

+0

嘗試創建(不創建!) – Dorian

+0

@Dorian,創建並保存!拋出預期的錯誤。謝謝......以及有多混亂。 – Koquillion

回答

0

@jaydel是在.create正確將返回模型(實例不管它保存在數據庫中或不)。

如果驗證通過,則創建一個對象(或多個對象)並將其保存到數據庫。無論對象是否成功保存到數據庫,都會返回結果對象。

但是,調用.save!在.create'd模型或調用.create!如果驗證失敗,將會引發異常。

創建一個對象就像ActiveRecord :: Base.create但調用save!而不是保存,如果記錄無效,則會引發異常。

.save將運行驗證,但是返回false,如果他們失敗。

默認情況下,保存始終運行驗證。如果其中任何一個失敗,則取消操作並保存返回錯誤。但是,如果您提供:validate => false,則完全繞過驗證。有關更多信息,請參閱ActiveRecord ::驗證。