Ruby on rails 使用:if进行验证
我试图创建一个条件,其中属性“一”为零,属性“二”为一,则模型无效。但当我做出以下决定时:Ruby on rails 使用:if进行验证,ruby-on-rails,ruby-on-rails-3,validation,activerecord,rails-activerecord,Ruby On Rails,Ruby On Rails 3,Validation,Activerecord,Rails Activerecord,我试图创建一个条件,其中属性“一”为零,属性“二”为一,则模型无效。但当我做出以下决定时: Model.create(:one => 1, :two => 0).valid? 单元测试返回true!为什么? 我认为您的语法有错误: validates :one, :two, :presence => true, :if => :condition_testing? def condition_testing? !(one == 0 && two
Model.create(:one => 1, :two => 0).valid?
单元测试返回true!为什么?
我认为您的语法有错误:
validates :one, :two, :presence => true, :if => :condition_testing?
def condition_testing?
!(one == 0 && two == 1)
end
有一个:如果里面太多了。。。
如果我理解正确,你想让它只在1==0&&2==1的情况下进行验证吗?
那你是在测试吗?是倒漏了
如果不确定,您可以尝试在条件测试中使用并插入断点?方法来查看发生了什么
请注意:在条件测试之前,问题是您使用的状态验证程序的条件检查属性值。这是不正确的。状态验证程序检查以确保设置了这些属性。更糟糕的是,您正在传递if选项@Tigraine对语法错误的判断是正确的,顺便说一句,这意味着无论该方法何时返回true,都不会检查存在性。按照这种设置方式,只有当一个等于1,两个等于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,这将向带有指定消息的模型添加错误。注意:我仍然不清楚什么条件是有效的,什么条件是无效的,所以请随意更改最后一部分以满足您的需要。您最好使用数字和等于
validates :one, :numericality => { :equal_to => 0 }
validates :two, :numericality => { :equal_to => 1 }
您可以在一行中验证它:
validates :one, :two, :presence => true, :if => Proc.new { |a| !(a.one == 0 && a.two == 1) }
不,那是正确的。结果是,无论值是多少of attributes总是表示模型是有效的,我希望当'one'和'two'分别为0和1时,表示模型是无效的。这意味着每当该方法返回true时,将根本不检查存在性-这是完全错误的。-仅当:if方法返回true时,验证才会运行。
validates :one, :two, :presence => true, :if => Proc.new { |a| !(a.one == 0 && a.two == 1) }