【问题标题】:Validates with :if使用 :if 进行验证
【发布时间】:2012-01-21 23:07:32
【问题描述】:

我正在尝试创建属性“一”为零且属性“二”为一的条件,则模型无效。但是当我制作时:

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

【问题讨论】:

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


    【解决方案1】:

    我认为你的语法有错误:

    validates :one, :two, :presence => true, :if => :condition_testing?
    
    def condition_testing?
        !(one == 0 && two == 1)
    end
    

    有一个:如果那里太多... 如果我理解正确,您只想在one == 0 && two == 1 的情况下验证它? 然后你condition_testing?被倒置(省略!())

    如果不确定您可以尝试使用pry 并在condition_testing? 方法中插入断点以查看发生了什么。

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

    【讨论】:

    • 不,这是正确的。发生的情况是,无论属性的值总是表示模型是有效的,而我希望当 'one' 和 'two' 为 0 和 1 时表示模型无效。
    【解决方案2】:

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

    【讨论】:

    • “这意味着只要该方法返回 true,就根本不会检查存在”——这是完全错误的。 guides.rubyonrails.org/… - 验证仅在 :if 方法返回 true 时运行。
    【解决方案3】:

    你最好使用数值和等于。

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

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

    【讨论】:

      【解决方案4】:

      您可以在一行中验证它:

      validates :one, :two, :presence => true, :if => Proc.new { |a| !(a.one == 0 && a.two == 1) }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-01-13
        • 2016-09-09
        • 1970-01-01
        • 1970-01-01
        • 2012-06-23
        相关资源
        最近更新 更多