Why do I get nil can\'t be coerced into BigDecimal when I try to perform a calculation: here\'s the code:
model/drink.rb
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.