由于在主控制器中使用 'auto-add' 方法,PATCH 请求被忽略

PATCH request ignored due to use of an 'auto-add' method in main controller

在编写 Sinatra 应用程序时,我在 config.ru 文件中添加了一个函数来自动使用额外的控制器,同时 运行 我的主要应用程序控制器(下面最后一行代码)。所有测试都通过了直到 PATCH 编辑请求,它甚至在控制器中都没有被识别(我尝试在请求中窥探)。

参见下面的config.ru代码;为什么在使用下面的方法自动添加控制器时 PATCH(我假设是 DELETE)无法识别?当我添加下面代码底部显示的 "use SongsController...ect" 时,我的应用程序运行起来就像一个魅力。提前致谢。

require './config/environment'

if ActiveRecord::Migrator.needs_migration?
  raise 'Migrations are pending. Run `rake db:migrate` to resolve the issue.'
end

# auto-add controllers
Dir[File.join(File.dirname(__FILE__), "app/controllers",  "*.rb")].collect {|file| File.basename(file).split(".")[0] }.reject {|file|    file == "application_controller" }.each do |file|
  string_class_name = file.split('_').collect { |w| w.capitalize }.join
  class_name = Object.const_get(string_class_name)
  use class_name
end

use Rack::MethodOverride
use SongsController
use ArtistsController
use GenresController
run ApplicationController

如果您的请求来自浏览器,那么它们实际上是 POST 个请求,而不是 PATCHDELETE(如 GETPOST 是浏览器使用的唯一方法)。为了使用其他 HTTP 动词 Sinatra relies on the Rack::MethodOverride 中间件,如果存在隐藏的 _method 参数,它会将请求转换为正确的类型。

您的配置中有此中间件,但在您的代码之后才能找到并添加您的其他控制器。这意味着当请求到达时,当那些控制器看到它时,它不会被修改为适当的类型,因此它们会将其视为 POST 而不是 PATCH 并忽略它。

解决方法是将行 use Rack::MethodOverride 移动到自动添加您的其他控制器的代码之前,以便在您的控制器看到它们之前修改请求。