由于使用'自动添加'而忽略了PATCH请求主控制器中的方法

时间:2018-01-11 06:11:34

标签: sinatra rack

在编写Sinatra应用程序时,我在config.ru文件中添加了一个函数,以自动使用其他控制器,同时还运行我的主应用程序控制器(下面的最后一行代码)。所有测试都传递到PATCH编辑请求,甚至在控制器中都没有被识别(我试图在请求中进行搜索)。

请参阅下面的config.ru代码;为什么在使用下面的方法自动添加控制器时不能识别PATCH(我假设DELETE)?当我添加"使用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

1 个答案:

答案 0 :(得分:0)

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

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

修复只是将代码行use Rack::MethodOverride移到代码之前以自动添加其他控制器,因此在控制器看到请求之前会修改请求。