Search code examples
ruby-on-railsherokucurrencybigdecimal

Undefined method `to_d' on Heroku


I have an App deployed to Heroku, which gives me the below error when trying to create a new Choice in the database. I'm using virtual attributes to handle money in the app as integers. It works just fine on my own machine but when deployed to Heroku to to_d method fails.. why :)

2012-11-12 09:48:54+00:00 app web.1 - -
2012-11-12 09:48:54+00:00 heroku router - - POST www.mydomain.com/choices dyno=web.1 queue=0 wait=0ms service=68ms status=500 bytes=643
2012-11-12 09:48:54+00:00 app web.1 - -
2012-11-12 09:48:54+00:00 app web.1 - - Started POST "/choices" for 87.60.190.9/x1-6-00-16-cb-c1-a8-b7.k989.webspeed.com at 2012-11-12 09:48:54 +0000
2012-11-12 09:48:54+00:00 app web.1 - -
2012-11-12 09:48:54+00:00 app web.1 - - NoMethodError (undefined method `to_d' for 6600:Fixnum):
2012-11-12 09:48:54+00:00 app web.1 - - app/models/choice.rb:27:in `value_in_currency'
2012-11-12 09:48:54+00:00 app web.1 - - app/controllers/choices_controller.rb:9:in `create'
2012-11-12 09:48:54+00:00 app web.1 - -
2012-11-12 09:48:54+00:00 app web.1 - -
2012-11-12 09:48:54+00:00 app web.1 - - Processing by ChoicesController#create as HTML
2012-11-12 09:48:54+00:00 app web.1 - - Parameters: {"utf8"=>"✓", "authenticity_token"=>"YygjksxB+1SXnJ8j4jvTtxnh2JfJELpCeHysGrvItcU=", "choice"=>{"spotarea_id"=>"1", "product_id"=>"1", "value_in_currency"=>"66", "exposure"=>"80", "deliverydate"=>"2012-11-13"}, "commit"=>"Create Choice"}
2012-11-12 09:48:54+00:00 app web.1 - - Completed 500 Internal Server Error in 38ms

My Choice model contains the following:

class Choice < ActiveRecord::Base
  belongs_to :user
  belongs_to :spotarea
  belongs_to :product
  has_many   :bets,       :dependent => :destroy

  attr_accessible     :deliverydate, :exposure, :value_in_currency, :user_id, :spotarea_id, :product_id
  attr_accessible     :deliverydate, :exposure, :value_in_currency, :user_id, :spotarea_id, :product_id, as: :admin

  # Validations
  validates   :spotarea, :product, :value_in_currency, :exposure, :presence => { :message => "is missing!" }
  validates   :value_in_currency, :exposure, :numericality => { :message => "is not numeric!" }
  validates   :value_in_currency, :format => { :with => /^\d+\.?\d{0,2}$/, :message => "is not correctly formatted!" }

  def value_in_currency
    value.to_d/100 if value?
  end

  def value_in_currency=(currency)
    self.value = currency.to_d*100 if currency.present?
  end
end

EDIT:

I think I found a solution. I rewrote the code, so it now contains the below instead. Still can't see why the to_d don't work..

def value_in_currency
  BigDecimal(value.to_s)/100 if value?
end

def value_in_currency=(currency)
  self.value = BigDecimal(currency.to_s)*100 if currency.present?
end

Solution

  • I think I found a solution. I rewrote the code, so it now contains the below instead. Still can't see why the to_d don't work..

    def value_in_currency
      BigDecimal(value.to_s)/100 if value?  
    end
    
    def value_in_currency=(currency)
      self.value = BigDecimal(currency.to_s)*100 if currency.present?
    end