【发布时间】:2009-08-08 16:34:50
【问题描述】:
如果我这样做:
curl -X POST -H 'Content-type: application/xml' -d '<person>...</person>' 'http://0.0.0.0:3000/people/12?_method=PUT'
我收到“仅允许获取、放置和删除请求”。为什么?导轨 2.3.2
【问题讨论】:
标签: ruby-on-rails http rest rack middleware
如果我这样做:
curl -X POST -H 'Content-type: application/xml' -d '<person>...</person>' 'http://0.0.0.0:3000/people/12?_method=PUT'
我收到“仅允许获取、放置和删除请求”。为什么?导轨 2.3.2
【问题讨论】:
标签: ruby-on-rails http rest rack middleware
luca 是正确的,您需要在请求中发送 X-Http-Method-Override 标头。将 _method=put 放在 JSON 正文中对我不起作用。您的 curl 命令行将如下所示:
curl
-H "X-Http-Method-Override: put"
-H "Content-Type: application/json"
-d "{\"user\":{\"email\":\"blah@example.com\"}}"
www.site.com/users/username.json
【讨论】:
这实际上是 Rails 最新版本中的故障。解决方案是使用 put 传递 HTTP 方法覆盖标头。重要提示:标头的全名是 http-x-http-method-override 但 rails 添加了 http 前缀,因此您应该修剪该部分。
【讨论】:
有几件事可能会出错。
首先,您发送的是带有curl 的POST,但您的网址中有“神奇”的_method 参数,它设置为PUT。根据错误,听起来 Rails 将POST 作为权威请求类型。不使用它试试看会发生什么。
如果出现更普通的错误,路由(在config/routes.rb 中可以配置为不允许POST 请求您尝试使用的操作。
如果您使用的是标准 RESTful 控制器,这很有意义,因为您正在访问一个成员 (/people/12),该成员默认情况下只允许 GET、PUT 和 DELETE。
我会尝试使用 curl -X PUT 并从您的请求中删除 ?_method=PUT。
【讨论】:
<input name="_method" type="hidden" value="put" />。