3

所以我想知道我们是否可以有一个条件 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 docs我看起来没有将方法传递给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

还有其他方法可以使它正常工作吗?

谢谢

4

2 回答 2

9

您可以使用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 个验证,一个适用于 when draft? == true,这将允许 nils,一个 wheredraft? == false将不允许 nils

于 2012-08-12T12:34:57.060 回答
0

你不需要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
于 2019-09-03T22:34:32.947 回答