当我使用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
我很感激任何帮助,因为我完全难过。我确实看到一些人发布了自定义验证方法。这看起来很基本,我无法弄清楚如何继续。
答案 0 :(得分:0)
由于total_price
在验证之前运行,因此在执行回调时quantity
可以是nil
。这实际上是在Shoulda匹配器运行时幕后发生的事情,这就是你得到错误的原因。它正在尝试将*
方法发送到quantity
nil
。
改为使用after_validation
或before_save
。