0

Shoulda の validates_presence_of を使用すると、before_validation コールバックでつまずきます。

before_validation   :set_document, :set_product, :set_price

私はこの仕様を通過させようとしています:

it { should validate_presence_of(:quantity).with_message("Please a quantity.") }

品目の数量、unit_price、tax_rate、および price のデータベースのデフォルトは 0 です。品目が検証される前に、変更された場合に備えて、他の属性から価格を計算します。

この計算に関係するすべての属性に対して、このエラーと同様のエラーが発生します。

3) LineItem 
   Failure/Error: it { should validate_presence_of(:quantity).with_message("Please a quantity.") }
   NoMethodError:
     undefined method `*' for nil:NilClass
   # ./app/models/line_item.rb:153:in `total_price'
   # ./app/models/line_item.rb:223:in `set_price'
   # ./spec/models/line_item_spec.rb:32:in `block (2 levels) in <top (required)>'

私のコールバック、set_price は非常に単純です。

def set_price
  self.price = total_price
end

また、total_price メソッドも非常に単純です。

def total_price
  quantity * unit_price * (1 + tax_rate/100)
end

私は完全に困惑しているので、これについて何か助けていただければ幸いです。カスタム検証方法について何人かの人々が投稿しているのを見ました。これはとても基本的なことのようで、どう進めればいいのかわかりません。

4

1 に答える 1

0

検証の前にtotal_price実行されるため、コールバックが実行された時点である可能性があります。これは、実際に Shoulda マッチャーの実行時にバックグラウンドで発生することであり、エラーが発生する理由です。メソッドをに送信しようとしていますが、これはです。quantitynil*quantitynil

代わりにafter_validationまたはを使用してください。before_save

于 2013-06-14T17:18:09.807 に答える