【问题标题】:Rails Model Validation Conditional allow_nil?Rails 模型验证条件 allow_nil?
【发布时间】:2012-08-12 12:27:54
【问题描述】:

所以我想知道我们是否可以有条件 allow_nil 选项来验证 Rails 模型。

我想做的是能够根据一些逻辑(一些其他属性)allow_nil

所以我有一个可以保存为草稿的产品模型。当保存为草稿时,价格可以为零,但当不是草稿时,保存的价格应该是数字。我怎样才能做到这一点。以下似乎不起作用。它适用于草稿案例,但即使状态不是草稿也允许为零。

class Product<ActiveRecord::Base
   attr_accessible :status, price
   validates_numericality_of :price, allow_nil: :draft?

   def draft?
     self.status == "draft"
   end

end

查看 rails 文档,我似乎没有将方法传递给 allow_nil 的选项?

一种可能的解决方案是对两种情况分别进行验证

 with_options :unless => :draft? do |normal|
    normal.validates_numericality_of :price
 end

 with_options :if => :draft? do |draft|
   draft.validates_numericality_of :price, allow_nil: true
 end

还有其他方法可以让它工作吗?

谢谢

【问题讨论】:

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


    【解决方案1】:

    您可以使用ifunless 执行以下操作

    class Product<ActiveRecord::Base
       attr_accessible :status, price
       validates_numericality_of :price, allow_nil: true, if: :draft?
       validates_numericality_of :price, allow_nil: false, unless: :draft?
    
       def draft?
         self.status == "draft"
       end
    
    end
    

    通过上述设置,您将设置 2 种验证,一种适用于 draft? == true 时允许 nils,另一种适用于 draft? == false 时不允许 nils

    【讨论】:

    • 谢谢。这和我建议的一样。只是想知道是否有办法有条件的allow_nil?无论如何谢谢。会接受
    【解决方案2】:

    那么你就不需要allow_nil,只需使用if

    class Product < ActiveRecord::Base
       attr_accessible :status, price
       validates_numericality_of :price, if: -> { (draft? && !price.nil?) || !draft? }
    
       def draft?
         self.status == "draft"
       end
    end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-10
      • 2014-08-29
      • 2021-08-05
      • 1970-01-01
      • 1970-01-01
      • 2015-05-14
      • 1970-01-01
      • 2016-10-11
      相关资源
      最近更新 更多