8

我想創建一個條件,其中屬性'一'是零,屬性'二'是一個,那麼模型是無效的。但是當我製作時:驗證與:如果

Model.create(:one => 1, :two => 0).valid? 

單元測試返回true!爲什麼?

validates :one, :two, :presence => true, :if => :if condition_testing? 

def condition_testing? 
    !(one == 0 && two == 1) 
end 

回答

12

我認爲你必須在你的語法錯誤:

validates :one, :two, :presence => true, :if => :condition_testing? 

def condition_testing? 
    !(one == 0 && two == 1) 
end 

有一個:如果有太多的...... 如果我理解正確的話,你想擁有它只有在驗證案例one == 0 && two == 1? 然後你condition_testing? (不包括!())

如果不確定您可以嘗試使用pry並在您的condition_testing?方法中插入一個斷點以查看發生了什麼。

(請注意添加「:」之前狀態檢測)

+0

不,這是正確的。發生什麼事是,無論屬性的值總是說模型是有效的,我希望當'one'和'two'是0和1時表示模型是無效的。 – James 2011-12-16 12:16:50

3

的問題是,您使用的是存在驗證與檢查屬性值的條件。這是不正確的。存在驗證器檢查以確保設置這些屬性。更糟糕的是,你通過if選項(順便說一下,@ Tigraine是正確的,你的語法錯了),這意味着只要該方法返回true,根本就不會檢查存在。您設置的方式,只有當one等於1且two等於0時,驗證程序纔會運行。否則,根本不運行驗證!我覺得這裏最好的選擇是寫一個自定義的驗證:

validates :one_and_two 

def one_and_two 
    errors.add(:base, "one must be 1 and two must be 0") if !(one == 0 && two == 1) 
end 

如果條件返回true,這將錯誤添加到模型中使用指定的消息。 (注意:我還不清楚哪些條件是有效的,哪些是無效的,所以請隨時更改最後一部分以適應您的需求。)

+0

「這意味着只要該方法返回true,根本不會檢查存在」 - 這是完全錯誤的。 http://guides.rubyonrails.org/active_record_validations.html#conditional-validation - 驗證只在以下情況下運行:if方法返回true。 – Aldekein 2015-04-23 07:51:05

8

您可以在一行進行驗證:

validates :one, :two, :presence => true, :if => Proc.new { |a| !(a.one == 0 && a.two == 1) }