validation:if

我正在尝试创建一个条件,其中属性’one’为零,属性’two’为1,则模型无效。 但是,当我做:

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

unit testing返回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 

有一个:如果那里有太多…如果我理解正确你只想validationone == 0 && two == 1 ? 那你条件测试? 是倒置的(省略!())

如果不确定你可以尝试使用pry并在condition_testing?插入一个断点condition_testing? 看看发生了什么的方法。

(请注意在条件测试前添加“:”)

您可以在一行中validation它:

 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

问题是您正在使用状态validation程序,其条件是检查属性的值。 这是不正确的。 存在validation器检查以确保设置了这些属性。 更糟糕的是,你正在传递if选项(顺便提一下@Tigraine对你的语法错误是正确的),这意味着只要该方法返回true,就不会检查存在。 设置此方法的方法,validation器仅在one等于1且two等于0时运行。否则,根本不运行任何validation! 我认为这里最好的选择是编写自定义validation:

 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,这将使用指定的消息向模型添加错误。 (注意:我仍然不清楚哪种条件有效且哪些条件无效,所以请随意更改最后一部分以满足您的需求。)