2012-08-12 89 views
1

所以我想知道如果我们可以有一个条件allow_nil选项来验证轨道模型。Rails模型验证条件allow_nil?

我想这样做是为了能够根据一些逻辑(一些其他属性)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 

任何其他方式来得到这个工作做单独的验证?

感谢

回答

5

您可以使用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,这将使尼尔斯和其中draft? == false哪一个不允许nils

+0

谢谢。这与我所建议的相同。只是想知道是否有办法有一个有条件的allow_nil?无论如何,谢谢 – Abid 2012-08-12 12:40:33