验证:if

时间:2011-12-16 12:06:18

标签: ruby-on-rails ruby-on-rails-3 validation activerecord rails-activerecord

我正在尝试创建一个条件,其中属性“one”为零且属性“two”为1,则模型无效。但是当我做的时候:

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

3 个答案:

答案 0 :(得分:18)

我认为你的语法有错误:

validates :one, :two, :presence => true, :if => :condition_testing?

def condition_testing?
    !(one == 0 && two == 1)
end

有一个:如果那里太多了...... 如果我理解正确,您希望仅在one == 0 && two == 1的情况下进行验证? 那你条件测试?倒置(省略!())

如果不确定您可以尝试使用pry并在condition_testing?方法中插入断点,以查看正在发生的情况。

(请注意在条件测试前添加“:”)

答案 1 :(得分:4)

你最好使用数字并等于。

validates :one, :numericality => { :equal_to => 0 }

validates :two, :numericality => { :equal_to => 1 }

http://guides.rubyonrails.org/active_record_validations_callbacks.html#numericality

答案 2 :(得分:3)

问题在于您使用的是状态验证程序,其条件是检查属性的值。这是不正确的。存在验证器检查以确保设置了这些属性。更糟糕的是,你正在传递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,这将使用指定的消息向模型添加错误。 (注意:我仍然不清楚哪种条件有效且哪些条件无效,所以请随意更改最后一部分以满足您的需求。)