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