PUT或PATCH`_method`参数在rails-api中不起作用或不被尊重

时间:2018-03-07 11:38:09

标签: ruby-on-rails rails-api

TLDR:

使用rails --api,预期的铁路从PUT路由为POST and params[:_method]='put'方法,但路由为POST

假设:

  • rails 4.2.8
  • rails-api 0.4.1

请考虑以下事项:

配置/ 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:把
  ...

故障排除

  • 我尝试在新的rails项目中复制确切的代码,但这次没有使用--api模式,并且请求有效:它将_method='PUT'和路由识别为{{1}正确的。所以,我觉得这与普通轨道和api模式之间的一些差异有关。不幸的是,在几次搜索之后我找不到任何解决方案。

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:3)

_method隐藏字段的处理由一个机架中间件完成。

http://guides.rubyonrails.org/configuring.html#configuring-middleware

  

Rack :: MethodOverride 允许在设置params[:_method]时覆盖该方法。这是支持PATCH,PUT和DELETE HTTP方法类型的中间件。

我猜你在api模式下没有那个。添加它,请求应该正确路由。

奖金追踪

我自己也不知道(或很久以前忘了)。这就是我发现的方式。

  1. 转到https://github.com/rails/rails并尝试搜索:_method的回购(因为这可能是rails将如何处理该字段)。两分钟后意识到github没有搜索确切的术语。
  2. 在本地克隆导轨回购(5分钟)
  3. 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.
    
  4. 总时间:约7分钟。 Rails本身实际上并没有包含实际的相关代码,但它有文档。我很幸运:)