HTTP PUT isn't entirely cross browser so Rails (I'm using Rails 3) supports using POST and passing the _method
query param. This is great, but it doesn't seem to work when sending JSON.
Example:
$.ajax({
url: window.location.pathname,
type: 'POST',
contentType: 'application/json',
data: JSON.stringify({_method:'PUT', page:{my_data: 1}),
dataType: 'json'
});
When Rails sees this, it doesn't recognize the '_method' override because it's passed in the JSON format (perhaps that conversion is later?). Rails returns an error "No route matches ..." saying it can't find the route (to the resource), I assume because it doesn't match the REST update=HTTP PUT verb, I've even tried appending this to the URL: ?_method=PUT
but got the same result.
The only thing that does seem to work is setting an HTTP header:
$.ajax({
url: window.location.pathname,
type: 'POST',
contentType: 'application/json',
data: JSON.stringify({my_data: 1}),
dataType: 'json',
beforeSend: function(xhr){
xhr.setRequestHeader("X-Http-Method-Override","put");
}
});
Is setting the HTTP override header the best way?
AJAX supports the PUT
verb directly so why bothering with _method
and custom HTTP headers:
$.ajax({
url: window.location.pathname,
type: 'PUT',
contentType: 'application/json',
data: JSON.stringify({ page: { my_data: 1 }),
dataType: 'json'
});
Also make sure you are respecting the same origin policy or jquery might try to use JSONP which works only with GET
verbs.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With