3

そこで、Rails モデルの検証に条件付きの allow_nil オプションを使用できるかどうか疑問に思っていました。

私がやりたいことは、いくつかのロジック(他の属性)に応じて allow_nil できるようにすることです

ドラフトとして保存できる製品モデルがあります。下書きとして保存されている場合、価格はゼロになる可能性がありますが、下書き保存されていない場合、価格は数値でなければなりません。どうすればこれを達成できますか。以下はうまくいかないようです。ドラフトの場合は機能しますが、ステータスがドラフトでない場合でも 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 に渡すオプションがないように見えますか?

考えられる解決策の 1 つは、両方のケースに対して別々の検証を行うことです。

 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

とを使用して、次のことができifますunless

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 つの検証が設定されます。1 つは whendraft? == trueに適用され、nil を許可し、もう 1 つは nil をdraft? == false許可しません。

于 2012-08-12T12:34:57.060 に答える