使用rails --api
,预期的铁路从PUT
路由为POST and params[:_method]='put'
方法,但路由为POST
请考虑以下事项:
配置/ routes.rb中:
resources :sessions, do
put 'authenticate', on: :collection
end
某些客户端HTML文件:
<form action='http://localhost:3000/sessions/authenticate' method='post'>
<input type='hidden' name='_method' value='put'>
...
</form>
...表格提交:
rails server
输出
Started POST "/sessions/authenticate" for ::1 at 2018-03-07 11:20:21 +0000
No route matches [POST] "/sessions/authenticate" excluded from capture: DSN not set
ActionController::RoutingError (No route matches [POST] "/sessions/authenticate"):
actionpack (4.2.8) lib/action_dispatch/middleware/debug_exceptions.rb:21:in `call'
actionpack (4.2.8) lib/action_dispatch/middleware/show_exceptions.rb:30:in `call'
...
检查Chrome - &gt;开发人员工具 - &gt;网络标签 - &gt; [REQUEST],有效负载正确如下所示:
常规
请求网址:http://localhost:3000/sessions/authenticate
...
FORMDATA
_method:把
...
--api
模式,并且请求有效:它将_method='PUT'
和路由识别为{{1}正确的。所以,我觉得这与普通轨道和api模式之间的一些差异有关。不幸的是,在几次搜索之后我找不到任何解决方案。任何帮助都将不胜感激。
答案 0 :(得分:3)
_method
隐藏字段的处理由一个机架中间件完成。
http://guides.rubyonrails.org/configuring.html#configuring-middleware
Rack :: MethodOverride 允许在设置
params[:_method]
时覆盖该方法。这是支持PATCH,PUT和DELETE HTTP方法类型的中间件。
我猜你在api模式下没有那个。添加它,请求应该正确路由。
我自己也不知道(或很久以前忘了)。这就是我发现的方式。
:_method
的回购(因为这可能是rails将如何处理该字段)。两分钟后意识到github没有搜索确切的术语。Grep本地代码库(0.5秒)
sergio@soviet-russia ‹ master › : ~/projects/github/rails
[0] % ag ":_method"
guides/source/rails_on_rack.md
238:* Allows the method to be overridden if `params[:_method]` is set. This is the middleware which supports the PUT and DELETE HTTP method types.
guides/source/configuring.md
235:* `Rack::MethodOverride` allows the method to be overridden if `params[:_method]` is set. This is the middleware which supports the PATCH, PUT, and DELETE HTTP method types.
总时间:约7分钟。 Rails本身实际上并没有包含实际的相关代码,但它有文档。我很幸运:)