Ruby on Rails nil can't be coerced into BigDecimal

醉酒当歌 提交于 2019-11-29 07:16:46

If you want nil to be evaluated as 0.0 then you can do something like this:

def total_amount
    self.total_amount = self.price.to_s.to_d * self.quantity.to_s.to_d
end 

Or explicitly check for nil

def total_amount
  if self.price && self.quantity
    self.total_amount = self.price * self.quantity
  else
    self.total_amount = "0.0".to_d
  end
end 

The problem is really that your record fields aren't set like you expect them to be. Do you need to use validations to make sure that the price and quantity fields are set?

class Drink
  validates :price, :presence => true      # Don't forget add DB validations, too :)
  validates :quantity, :presence => true
end

That way you ensure that you don't get a nil value when calling #total_amount.

You're not setting the quantity value anywhere so it is nil and nil cannot be coerced into a number for the multiplication.

Presumably your price is a decimal(n,2) (for some n) in the database so self.price is represented in Ruby as a BigDecimal object; that's why you're getting complaints about not being able to coerce to BigDecimal.

You can get a similar error out of irb like this:

>> 11 * nil
TypeError: nil can't be coerced into Fixnum
    from (irb):7:in `*'

Your self.price is set though. If it wasn't then you'd get one of these:

NoMethodError: undefined method `*' for nil:NilClass

You might want to add

validates_presence_of :quantity, :price

(or possible stricter validations) to your model if you're requiring that they be set.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!