gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 03:01:08 26 4
gpt4 key购买 nike

简单描述:

使用 rails --api , 期望 rails 路由为 PUT方法来自 POST and params[:_method]='put' , 但路由为 POST

给出:

  • rails 4.2.8
  • rails-api 0.4.1

考虑以下几点:

config/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 -> 开发者工具 -> 网络选项卡 -> [REQUEST],负载正确,如下所示:

General
Request URL:http://localhost:3000/sessions/authenticate
...

FormData
_method:put
...

疑难解答

  • 我尝试在新的 Rails 项目中复制确切的代码,但这次没有使用 --api模式,并且请求有效:它识别了 _method='PUT'并将路由作为 PUT适本地。所以,我有一种感觉,这与普通 rails 和 api 模式之间的一些差异有关。不幸的是,经过多次搜索,我找不到任何解决方案。

如有任何帮助,我们将不胜感激。

最佳答案

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

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

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.

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

奖励轨道

我自己并不知道(或者很久以前就忘记了)。这是我的发现。

  1. 转到 https://github.com/rails/rails并尝试在该存储库中搜索 :_method(因为这很可能是 Rails 处理该字段的方式)。两分钟后意识到 github 没有搜索确切的术语。
  2. 在本地克隆 Rails 代码库(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.

总耗时:约 7 分钟。 Rails 本身实际上并不包含实际的相关代码,但它有文档。我很幸运。 :)

关于ruby-on-rails - PUT 或 PATCH `_method` 参数在 rails-api 中不起作用或不受尊重,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49150989/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com