zw

JSON output in Rails 2.1

I just came across a change in Rails 2.1 when converting an ActiveRecord object to JSON. The JSON output now includes the ActiveRecord model name in the object so if you have a user model and convert it to json, you get the following:

user = User.find(1)
user.to_json
{"user" : {"name" : "John Doe", "id" : 1}}

This becomes a pain when you're pulling this data via AJAX and you're doing something like this:

def show
  user = User.find(params[:id])

  # to_json is called automatically so you don't need to call it explicitly
  render :json => {:status => 'ok', :user => user}
end

In your client side code, you then have to type user twice, once for the hash key, and once for the ActiveRecord model name, to get to the user's attributes:

$.getJSON(url, function(json){
  if (json.status == 'ok') {
     // do something with user data
     alert(json.user.user.name);
  }
});

Unnecessarily redundant and inconvenient. This seems to have been changed in Rails 2.1, but the old behavior can be restored by editing config/initializers/new_rails_default.rb and changing:

# Include Active Record class name as root for JSON serialized output.
ActiveRecord::Base.include_root_in_json = true

to

# Include Active Record class name as root for JSON serialized output.
ActiveRecord::Base.include_root_in_json = false

Restart your app, and you'll now get just the attributes for the model and not the model name.