Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 使用:if进行验证_Ruby On Rails_Ruby On Rails 3_Validation_Activerecord_Rails Activerecord - Fatal编程技术网

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) }