sending parameters with brackets [ ] via AngularJS
By: Johnathon Wright on: December 06, 2013
I want an AngularJS controller to POST to a Rails endpoint with parameters like { 'item[price]': '32.50' } and have Rails see it as "item" => {"price": "32.50"}. This works perfectly well in normal HTML... it's not clear why it isn't working in Angular.
Via HTTP
It works in a normal HTML form:
<form action="/items.json" method="POST">
<input name="item[price]" type="text" value="32.50" />
<input type="submit">Save</input>
</form>
submitting this form, we see this from Rails:
Started POST "/items.json" for 192.168.1.20 at 2013-12-06 09:47:04 -0600
Processing by ItemsController#create as JSON
Parameters: {"item"=>{"price"=>"32.50"}}
via $http.post
$http.post('/items.json', {'item[price]': '32.50'});
and Rails sees:
Started POST "/items.json" for 192.168.1.20 at 2013-12-06 09:50:39 -0600
Processing by ItemsController#create as JSON
Parameters: {"item[price]"=>"32.50", "item"=>{"item[price]"=>"32.50"}}
So what's different?
Checking Chrome's developer tools, under the network tab > Headers, we get some answers
When using a form, I see a section labeled "Form Data". After clicking "View Source" I get this:
item%5Bprice%5D=32.50
When using AngularJS, I see a section labeled "Request Payload". After clicking "View Source", I get this:
{"item[price]":"32.50"}
AH HA!
Final Solution
$scope.submit_data = function()
{
var xsrf = $.param({'item[price]': '32.50'});
$http.post('/items.json',
xsrf,
{headers: {'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'}}
);
}
References
"What is the difference between form data and request payload?"
How can I make angular.js post data as form data instead of a request payload?