使用HTTP PUT通过Jquery和Rails 3发送JSON

HTTP PUT并不完全是跨浏览器,因此Rails(我使用的是Rails 3)支持使用POST并传递_method查询参数。 这很好,但在发送JSON时它似乎不起作用。

例:

 $.ajax({ url: window.location.pathname, type: 'POST', contentType: 'application/json', data: JSON.stringify({_method:'PUT', page:{my_data: 1}), dataType: 'json' }); 

当Rails看到这个时,它不会识别’_method’覆盖,因为它以JSON格式传递(也许转换是稍后的?)。 Rails返回错误“没有路由匹配…”说它找不到路由(到资源),我假设因为它与REST update = HTTP PUT动词不匹配,我甚至尝试将此附加到URL: ?_method=PUT但得到了相同的结果。

唯一可行的方法是设置HTTP标头:

 $.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"); } }); 

设置HTTP覆盖标头是最好的方法吗?

AJAX直接支持PUT动词,所以为什么要_method和自定义HTTP头:

 $.ajax({ url: window.location.pathname, type: 'PUT', contentType: 'application/json', data: JSON.stringify({ page: { my_data: 1 }), dataType: 'json' }); 

还要确保您尊重相同的原始策略,或者jquery可能会尝试使用仅适用于GET动词的JSONP。