[英]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.