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