Rails 4.2.9 works well with Ruby 2.4.2 except for an incompatible change with invalid decimal values and String#to_d. BigDecimal was changed in 1.3.0 (which ships with Ruby 2.4) to throw an exception on invalid values passed to the constructor. This also impacted String#to_d and caused it to raise an exception when it didn’t previously.
If string_amount is an empty String, code like this:
string_amount.to_d
will throw an exception like:
ArgumentError: invalid value for BigDecimal(): ""
rather than returning 0 as it did on ruby 2.3 and below.
This is handled in Rails 5 but the change has not been ported back to Rails 4.
If you’re on Rails 4, you’ve got a few options. You could add a monkey patch in your application.rb or initializer:
class String def to_d begin BigDecimal(self) rescue ArgumentError BigDecimal(0) end end end
Or alternatively upgrade the BigDecimal version in your bundle. Ie, add to your Gemfile:
gem "bigdecimal", ">= 1.3.2"
Bundler will ensure you get the later version of BigDecimal rather than the one that ships with Ruby 2.4, and the behaviour was later fixed in BigDecimal 1.3.2 (but Ruby does not include it yet). See the Ruby issue for more details.
Julien ITARD
Very nice ! Thanks for sharing.