我正在尝试创建一个条件,其中属性“one”为零且属性“two”为1,则模型无效。但是当我做的时候:
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
答案 0 :(得分:18)
我认为你的语法有错误:
validates :one, :two, :presence => true, :if => :condition_testing?
def condition_testing?
!(one == 0 && two == 1)
end
有一个:如果那里太多了......
如果我理解正确,您希望仅在one == 0 && two == 1
的情况下进行验证?
那你条件测试?倒置(省略!())
如果不确定您可以尝试使用pry并在condition_testing?
方法中插入断点,以查看正在发生的情况。
(请注意在条件测试前添加“:”)
答案 1 :(得分:4)
你最好使用数字并等于。
validates :one, :numericality => { :equal_to => 0 }
validates :two, :numericality => { :equal_to => 1 }
http://guides.rubyonrails.org/active_record_validations_callbacks.html#numericality
答案 2 :(得分: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,这将使用指定的消息向模型添加错误。 (注意:我仍然不清楚哪种条件有效且哪些条件无效,所以请随意更改最后一部分以满足您的需求。)