Ruby on Rails nil can't be coerced into BigDecimal

后端 未结 2 871
日久生厌
日久生厌 2020-12-17 00:55

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



        
相关标签:
2条回答
  • 2020-12-17 00:59

    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.

    0 讨论(0)
  • 2020-12-17 01:14

    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.

    0 讨论(0)
提交回复
热议问题