簡體   English   中英

用:if驗證

[英]Validates with :if

我正在嘗試創建一個條件,其中屬性“一”為零,屬性“二”為一,那么模型無效。 但是當我做:

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嗎? 被倒置(省略!())

如果不確定,您可以嘗試使用並將斷點插入condition_testing? 看看發生了什么的方法。

(請注意在條件測試之前添加了“:”)

您可以一行驗證它:

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

您最好使用數字等於。

validates :one, :numericality => { :equal_to => 0 }

validates :two, :numericality => { :equal_to => 1 }

http://guides.rubyonrails.org/active_record_validations_callbacks.html#numericality

問題是您使用的狀態驗證器具有檢查屬性值的條件。 這是不正確的。 存在驗證器檢查以確保設置了那些屬性。 更糟糕的是,您傳遞了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,則會使用指定的消息向模型添加錯誤。 (注意:我仍然不清楚什么條件有效和無效,因此可以隨意更改最后一部分以滿足您的需求。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM