2012-07-26 20 views
0

保存對象時,我希望執行的字段有更新。 無論對象是否經過驗證,此更新都必須發生, 並且必須在驗證之前進行。Rails 2.3.14:保存未經驗證時,before_validation未運行

問題是before_validation在沒有驗證的情況下保存時不運行。 這段代碼應該放在哪裏? 有沒有一種方法可以在保存而不驗證時調用before_validation回調?

謝謝!

回答

1

沒有,根據http://api.rubyonrails.org/classes/ActiveRecord/Callbacks.html

你,因爲你是頑皮達不到這個問題,要保存未經驗證。不要那麼做。 嚴重。相反,你應該放鬆你的驗證策略,所有這些「無需驗證的保存」廢話,變成「保存與驗證」,而不是。

爲此,您可以將某些選項傳遞給驗證方法,或者在自定義方法中使用一些條件子句。

class User < ActiveRecord::Base 
    before_validation :my_crazy_thing  
    validates_presence_of :name, :unless => :is_a_robot? 

    def is_a_robot? 
    @brain_type == :positronic 
    end 

    def my_crazy_thing 
    @brain_type = brain_surgery.brain_type 
    # or whatever 
    end 

    def validate 
    if condition_exists_to_run_custom_validations 
     errors.add_to_base 'WTF' if @universe.exploded? 
    end 
    end 
end 

所以之前,你不得不跳過驗證,以便機器人可以存在沒有名稱。但是如果你正確地設置了驗證,那麼如果沒有它們,你永遠不需要保存。你可以告訴你已經正確設置了它們,因爲如果不再驗證,就不必保存。現在你可以正常使用before_validation回撥作爲一個很好的獎勵。

+0

謝謝!你已經啓發了我:)我保存時沒有驗證什麼時候我遇到過許多帶有after_save觸發器的對象將不得不被保存的情況,並且如果所有那些after_save都沒有在所有驗證之前發生,那麼非通過驗證。 。 – Nadav 2012-07-26 11:19:36