由于在主控制器中使用 '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
个请求,而不是 PATCH
或 DELETE
(如 GET
和 POST
是浏览器使用的唯一方法)。为了使用其他 HTTP 动词 Sinatra relies on the Rack::MethodOverride
中间件,如果存在隐藏的 _method
参数,它会将请求转换为正确的类型。
您的配置中有此中间件,但在您的代码之后才能找到并添加您的其他控制器。这意味着当请求到达时,当那些控制器看到它时,它不会被修改为适当的类型,因此它们会将其视为 POST
而不是 PATCH
并忽略它。
解决方法是将行 use Rack::MethodOverride
移动到自动添加您的其他控制器的代码之前,以便在您的控制器看到它们之前修改请求。
在编写 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
个请求,而不是 PATCH
或 DELETE
(如 GET
和 POST
是浏览器使用的唯一方法)。为了使用其他 HTTP 动词 Sinatra relies on the Rack::MethodOverride
中间件,如果存在隐藏的 _method
参数,它会将请求转换为正确的类型。
您的配置中有此中间件,但在您的代码之后才能找到并添加您的其他控制器。这意味着当请求到达时,当那些控制器看到它时,它不会被修改为适当的类型,因此它们会将其视为 POST
而不是 PATCH
并忽略它。
解决方法是将行 use Rack::MethodOverride
移动到自动添加您的其他控制器的代码之前,以便在您的控制器看到它们之前修改请求。