我有一个使用模块化样式的Sinatra应用程序。除了我没有被调用的错误处理程序块之外,一切正常。这是相关的代码:
app.rb
require_relative './routes/base'
require_relative './routes/routing'
module Example
class App < Sinatra::Application
use Routes::Base
use Routes::Routing
end
end
base.rb
require 'sinatra/base'
module Example
module Routes
class Base < Sinatra::Application
configure do
# etc.
end
# Error pages.
error 404 do # <- Doesn't get invoked.
erb :not_found
end
error 500 do # <- Doesn't get invoked.
erb :internal_server_error
end
end
end
end
routing.rb
module Example
module Routes
class Routing < Base
get '/?' do
erb :home
end
end
end
end
为什么我的错误处理程序不起作用?
提前致谢。
答案 0 :(得分:3)
use
method is for adding middleware to an app,你不能用它来组成这样的应用程序。
在您的示例中,您实际上有三个不同的Sinatra应用程序,其中两个正在作为中间件运行。当Sinatra应用程序作为中间件运行时,任何与其路由匹配的请求都由该应用程序处理,否则请求将传递给Rack堆栈中的下一个组件。错误处理程序仅在请求已由同一应用程序处理时才适用。您已定义错误处理程序的应用程序已定义了 no 路由,因此所有请求都将在堆栈中传递 - 错误处理程序将永远不会被使用。
组织这样的大型应用程序的一种方法是简单地使用相同的类并在不同的文件中重新打开它。另一个问题有一个可能有用的示例:Using Sinatra for larger projects via multiple files。