I thought Rails 3.2 ActionController automatically converts JSON params hashes...

170 views
Skip to first unread message

G-money

unread,
Jul 6, 2013, 4:14:09 PM7/6/13
to rubyonra...@googlegroups.com
Hey,

I was thinking I'd have my controllers do double-duty: the same actions handling json and html requests differentially. For this, it's useful that Rails 3.2 automatic params hash conversion from json work (as described here in the Rails docs). (I'm using ruby 1.9.2.) But it doesn't, that is, it seems I am required to decode the json params explicitly. Why?

Here's an example of a post from my dev log...

Processing by MarketlessPriceRequestsController#create as JSON
  Parameters: {"utf8"=>"✓", "price_request"=>"{\"prices_are_public_to_pricemakers\":false, ...

Here's params[:price_request] in the controller

{"prices_are_public_to_pricemakers":false, ...

But it looks like I need to decode the json explicity to get to the accepted form...

{"prices_are_public_to_pricemakers"=>false, ...

Can I configure my controllers to help me avoid the explicit decode step?

Thanks,

G

Frederick Cheung

unread,
Jul 7, 2013, 1:09:34 PM7/7/13
to rubyonra...@googlegroups.com


On Saturday, July 6, 2013 9:14:09 PM UTC+1, G-money wrote:
Hey,

I was thinking I'd have my controllers do double-duty: the same actions handling json and html requests differentially. For this, it's useful that Rails 3.2 automatic params hash conversion from json work (as described here in the Rails docs). (I'm using ruby 1.9.2.) But it doesn't, that is, it seems I am required to decode the json params explicitly. Why?

Is the thing making the requests setting the content type  to application/json ?

Fred 

Matt Jones

unread,
Jul 7, 2013, 7:36:48 PM7/7/13
to rubyonra...@googlegroups.com
+1 to Fred's suggestion: make sure the parameters are being *sent* as application/json.

I'd also recommend double-checking the code that is sending the data - what you're getting looks like what would result if you did something like this:

(in Rails)
render :json => { :price_request => @price_request.to_json }

(in JS)
$.post('/some_url', { price_request: JSON.generate(some_data_object) })

In both cases, there's two conversions to JSON going on - one explicit, then the other implicit in the transmission (either the render or the post).

--Matt Jones 
Reply all
Reply to author
Forward
0 new messages