错误处理程序不能在模块化Sinatra应用程序中运行

时间:2014-08-02 17:30:58

标签: ruby sinatra

我有一个使用模块化样式的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

为什么我的错误处理程序不起作用?

提前致谢。

1 个答案:

答案 0 :(得分:3)

use method is for adding middleware to an app,你不能用它来组成这样的应用程序。

在您的示例中,您实际上有三个不同的Sinatra应用程序,其中两个正在作为中间件运行。当Sinatra应用程序作为中间件运行时,任何与其路由匹配的请求都由该应用程序处理,否则请求将传递给Rack堆栈中的下一个组件。错误处理程序仅在请求已由同一应用程序处理时才适用。您已定义错误处理程序的应用程序已定义了 no 路由,因此所有请求都将在堆栈中传递 - 错误处理程序将永远不会被使用。

组织这样的大型应用程序的一种方法是简单地使用相同的类并在不同的文件中重新打开它。另一个问题有一个可能有用的示例:Using Sinatra for larger projects via multiple files