Wel the title says it all :)
There's a subtile, but very important difference between Ruby on Rails 3 and 4 with json serialization.
Rails 3
(1..10).as_json => [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
Rails 4
(1..10).as_json => "1..10"
I had a piece of Ruby code that modeled the business rules of the application like this:
{
brackets: [
{ income: 0..19_645, perc: 37 },
{ income: 19_646..55_991, perc: 42 },
{ income: 55_992..Float::INFINITY, perc: 52 }
]
}
Try serializing this to the browser with to_json in Rails 3 and prepare for a long wait ;)
The workaround I used to this was creating an initalizer "/config/initializer/range_to_json_monkey_patch.rb"
#
# This initializer requires some explanation
#
# In the ruby version installed (Rails 3.2.13) the json encoding method works like this:
# ActiveSupport::JSON::encode(1..10) => [1,2,3,4,5,6,7,8,9,10]
#
# Doing this with a large range is not nice!!
#
# Ruby on rails 4.0.0.1 works like this:
# ActiveSupport::JSON::encode(1..10) => "1..10"
#
# This initializer modifies the Range#as_json method so it works like rails 4
# this method first checks if this adjustment is required
#
if (1..4).as_json.kind_of?(Array)
class Range
def as_json( options=nil )
self.to_s
end
end
end
Now the json-serialization of Ranges will behave like the one in Rails 4.