2012-04-30 38 views
0

我努力做到以下幾點:Rails的條件驗證工作不

validates :price, :presence => true, :if => Proc.new {|p| p.available == true} 
    validates :price, :presence => false, :if => Proc.new {|p| p.available == false} 

所以如果該布爾:提供真實,:價格必須存在,而且如果是假的,:價格必須是零。

但是,當我在控制檯中測試它不工作。任何關於我可能會做錯什麼的想法?

+0

見[條件驗證文檔(http://guides.rubyonrails.org/active_record_validations_callbacks.html#using-a-proc-with-if-和除非);我假設你試圖強制*而不是*有價格的假如可用? –

+0

這是正確的。我只是檢查了他們,但沒有看到可能出錯的線索...... –

+0

我不認爲可以堆疊驗證 - 我指的是「分組」部分。 –

回答

2

是的,我不確定你現在可以堆疊驗證。但是,您可能能夠從before_validation中執行所需的操作。

class Foo 
    before_validation :price_matches_available 

    def price_matches_available 
    available ? price.present? : price.nil? 
    end 
end 
+0

編輯:將該方法仍然工作作爲驗證程序(標記對象爲有效或無效?)。謝謝! –

+2

我會說是的,但StackOverflow需要15個字符的評論,所以yeeeeeeeeeeeees。 –

+1

哈哈。我的意思是「hahahahahahaha」 –

2

根據您的意見和我所能理解的是您有產品型號,並且您希望設置價格,只有當產品可用標誌爲真時。

根據其他評論,我不認爲你可以堆疊驗證...即使有可能以某種方式,我不認爲這是良好的用戶體驗有驗證錯誤,如「價格不能是如果產品不可用則設置「。

我的建議是隻有第一次驗證,如果該標誌設置爲false,則默默拒絕價格。首先通過JavaScript獲得良好的用戶體驗(當檢查布爾值時禁用輸入),然後在回調中確保沒有人篡改HTML。

紅寶石部分可以是這樣的:

class Product < ActiveRecord::Base 

    validates :price, presence: true, if: "available?" 

    before_save :reject_price, if: "available? == false" 

    private 

    def reject_price 
    self.price = nil 
    end 
end