【发布时间】:2011-04-29 18:53:13
【问题描述】:
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 动词,我什至尝试将它附加到网址:?_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 覆盖标头是最好的方法吗?
【问题讨论】:
-
看起来 4 年前的大多数 Web 浏览器都支持直接设置方法(XmlHTTPRequests 的 PUT POST DELETE),所以可以肯定地说它可以在不设置额外标头或
_method的情况下正常工作范围。我最初的错误是由于在路由到 rails 时混淆了 PUT / POST。看起来 4 年前的大多数 Web 浏览器都支持这个(PUT POST DELETE for XmlHTTPRequests),所以可以肯定地说它工作得很好。我最初的错误是由于在路由到 rails 时混淆了 PUT / POST。 -
你有没有弄清楚为什么顶级版本不起作用?
标签: jquery ruby-on-rails ajax http rest