Howdy,

I am making a few AJAX endpoints using rails, and noticed the following 
inconsistent behavior when setting the Content-Type to application/json. 
 Here are four different requests to show the problem I am having.

1. First, when I make the following example request:

curl -X GET 
"http://localhost:3000/api/v1/events?counts=true&order%5Bcolumn%5D=occurs_at&order%5Bdirection%5D=asc&page%5Bnumber%5D=1&page%5Blimit%5D=100";

Rails shows the following in the log:

Started GET 
"/api/v1/events?counts=true&order%5Bcolumn%5D=occurs_at&order%5Bdirection%5D=asc&page%5Bnumber%5D=1&page%5Blimit%5D=100"
 
for 127.0.0.1 at 2013-04-18 03:57:49 +0000
Processing by Api::V1::EventsController#index as JSON
  Parameters: {"counts"=>"true", "order"=>{"column"=>"occurs_at", 
"direction"=>"asc"}, "page"=>{"number"=>"1", "limit"=>"100"}}

2. However, if I change the Content-Type to be "application/json":

curl -X GET -H "Content-Type: application/json" 
"http://localhost:3000/api/v1/events?counts=true&order%5Bcolumn%5D=occurs_at&order%5Bdirection%5D=asc&page%5Bnumber%5D=1&page%5Blimit%5D=100";

I get the following:

Started GET 
"/api/v1/events?counts=true&order%5Bcolumn%5D=occurs_at&order%5Bdirection%5D=asc&page%5Bnumber%5D=1&page%5Blimit%5D=100"
 
for 127.0.0.1 at 2013-04-18 03:57:33 +0000
Processing by Api::V1::EventsController#index as JSON
  Parameters: {"counts"=>"true", "order"=>{"column"=>"occurs_at", 
"direction"=>"asc"}, "page"=>{"number"=>"1", "limit"=>"100"}, *"event"=>{}*}

The bold part is the extra parameter (in this case "event") that gets added 
by making this a JSON request.

3. The problem, is that this event parameter will clobber any parameter I 
send over also called event.  For example:

curl -X GET -H "Content-Type: application/json" 
"http://localhost:3000/api/v1/events?counts=true&order%5Bcolumn%5D=occurs_at&order%5Bdirection%5D=asc&page%5Bnumber%5D=1&page%5Blimit%5D=100&;
*event=Super%20Important%20Info*"

And it is not parsed from the params:

Started GET 
"/api/v1/events?counts=true&order%5Bcolumn%5D=occurs_at&order%5Bdirection%5D=asc&page%5Bnumber%5D=1&page%5Blimit%5D=100&
*event=Super%20Important%20Info*" for 127.0.0.1 at 2013-04-18 04:02:56 +0000
Processing by Api::V1::EventsController#index as JSON
  Parameters: {"counts"=>"true", "order"=>{"column"=>"occurs_at", 
"direction"=>"asc"}, "page"=>{"number"=>"1", "limit"=>"100"}, *"event"=>{}*}

4. But, if I dont pass the JSON content type:

curl -X GET 
"http://localhost:3000/api/v1/events?counts=true&order%5Bcolumn%5D=occurs_at&order%5Bdirection%5D=asc&page%5Bnumber%5D=1&page%5Blimit%5D=100&;
*event=Super%20Important%20Info*"

It works just fine:

Started GET 
"/api/v1/events?counts=true&order%5Bcolumn%5D=occurs_at&order%5Bdirection%5D=asc&page%5Bnumber%5D=1&page%5Blimit%5D=100&
*event=Super%20Important%20Info*" for 127.0.0.1 at 2013-04-18 04:02:22 +0000
Processing by Api::V1::EventsController#index as JSON
  Parameters: {"counts"=>"true", "order"=>{"column"=>"occurs_at", 
"direction"=>"asc"}, "page"=>{"number"=>"1", "limit"=>"100"}, *"event"=>"Super 
Important Info"*}

Is there any way I can just turn off this functionality?  I think it might 
be because this is an EventsController, and Rails is trying to give me 
something for free, but I just want to send over whatever I want, 
especially as I will have situations like an OrdersController, that I want 
to pass an order to (such as id asc, etc..).

Thanks for any help,

Robert

-- 
You received this message because you are subscribed to the Google Groups "Ruby 
on Rails: Talk" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msg/rubyonrails-talk/-/Eyqplc-I7YcJ.
For more options, visit https://groups.google.com/groups/opt_out.


Reply via email to