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