Rails JSON request is not parsed correctly into post parameters Rails JSON request is not parsed correctly into post parameters json json

Rails JSON request is not parsed correctly into post parameters


You can get past this by setting the Content-Type header to "application/json". You can let the controller know what it expects to return with the Accept header set to "application/json".

The following command with both headers:

curl -d '{ "company": { "name": "acme", "address": "123 Carrot Street" } }' http://0.0.0.0:3000/mysite --header "Accept: application/json" --header "Content-Type: application/json"

Generates this in the logs:

Started POST "/mysite" for 127.0.0.1 at 2012-01-11 16:09:48 -0800  Processing by MyController#create as JSON  Parameters: {"company"=>{"name"=>"acme", "address"=>"123 Carrot Street"}, "wassup"=>{"company"=>{"name"=>"acme", "address"=>"123 Carrot Street"}, "controller"=>"wassup", "action"=>"create"}}Completed 200 OK in 5ms (Views: 2.0ms | ActiveRecord: 0.0ms)

This command with the Accept header:

curl -d '{ "company": { "name": "acme", "address": "123 Carrot Street" } }' http://0.0.0.0:3000/mysite --header "Accept: application/json"

Generates these logs:

Started POST "/mysite" for 127.0.0.1 at 2012-01-11 16:07:26 -0800  Processing by MyController#create as JSON  Parameters: {"{ \"company\": { \"name\": \"acme\", \"address\": \"123 Carrot Street\" } }"=>nil}Completed 200 OK in 7ms (Views: 5.0ms | ActiveRecord: 0.0ms)

And finally this command with the Content-Type header:

curl -d '{ "company": { "name": "acme", "address": "123 Carrot Street" } }' http://0.0.0.0:3000/mysite --header "Content-Type: application/json"

Generates these logs:

Started POST "/mysite" for 127.0.0.1 at 2012-01-11 16:08:11 -0800  Processing by MyController#create as */*  Parameters: {"company"=>{"name"=>"acme", "address"=>"123 Carrot Street"}, "wassup"=>{"company"=>{"name"=>"acme", "address"=>"123 Carrot Street"}, "controller"=>"wassup", "action"=>"create"}}Completed 200 OK in 4ms (Views: 2.0ms | ActiveRecord: 0.0ms)

Notice the parsed parameters and processing message change subtly with each header type.


before_filter :fix_ie_params, only: [:create, :update]

For Thin:

def fix_ie_params  if request.format == '*/*'    # try to JSON decode in case of IE XDR    begin      params.merge! ActiveSupport::JSON.decode(request.body.string)    rescue Exception=>e      # todo: log exception    end  endend

For Unicorn and Phusion Passenger:

def fix_ie_params  if request.format == '*/*'    # try to JSON decode in case of IE XDR    begin      request.body.rewind      params.merge! ActiveSupport::JSON.decode(request.body.read)    rescue Exception=>e      # todo: log exception    end  endend