我想創建一個條件,其中屬性'一'是零,屬性'二'是一個,那麼模型是無效的。但是當我製作時:驗證與:如果
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
我想創建一個條件,其中屬性'一'是零,屬性'二'是一個,那麼模型是無效的。但是當我製作時:驗證與:如果
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
我認爲你必須在你的語法錯誤:
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?
方法中插入一個斷點以查看發生了什麼。
(請注意添加「:」之前狀態檢測)
的問題是,您使用的是存在驗證與檢查屬性值的條件。這是不正確的。存在驗證器檢查以確保設置這些屬性。更糟糕的是,你通過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,這將錯誤添加到模型中使用指定的消息。 (注意:我還不清楚哪些條件是有效的,哪些是無效的,所以請隨時更改最後一部分以適應您的需求。)
「這意味着只要該方法返回true,根本不會檢查存在」 - 這是完全錯誤的。 http://guides.rubyonrails.org/active_record_validations.html#conditional-validation - 驗證只在以下情況下運行:if方法返回true。 – Aldekein 2015-04-23 07:51:05
您最好使用數字和等於。
validates :one, :numericality => { :equal_to => 0 }
validates :two, :numericality => { :equal_to => 1 }
http://guides.rubyonrails.org/active_record_validations_callbacks.html#numericality
您可以在一行進行驗證:
validates :one, :two, :presence => true, :if => Proc.new { |a| !(a.one == 0 && a.two == 1) }
不,這是正確的。發生什麼事是,無論屬性的值總是說模型是有效的,我希望當'one'和'two'是0和1時表示模型是無效的。 – James 2011-12-16 12:16:50