繁体   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