如何在Rails 3.2中拯救来自中间件的自定义异常?

时间:2012-07-26 10:52:47

标签: ruby-on-rails-3 exception-handling middleware

我有一个使用Apartment的Rails 3.2应用程序,它用作中间件。公寓引发Apartment::SchemaNotFound例外情况,无法通过rescue_from中的ApplicationController进行救援。我认为我会使用this blog post中第3点所述的config.exceptions_app,但我不能将路由器设置为异常应用,我假设我必须创建自己的。

所以问题是:我该如何处理?

2 个答案:

答案 0 :(得分:3)

我遇到了类似的问题,另一件中间件抛出了一个自定义异常,所以我根本没有看过Apartment,但也许是这样的:

#app/middleware/apartment/rescued_apartment_middleware.rb
module Apartment
  class RescuedApartmentMiddleware < Apartment::Middleware
    def call(env)
      begin
        super
      rescue Apartment::SchemaNotFound
        env[:apartment_schema_not_found] = true # to be later referenced in your ApplicationController
        @app.call(env) # the middleware call method should return this, but it was probably short-circuited by the raise
      end
    end
  end
end

然后在您的环境中:

config.middleware.use(Apartment::RescuedApartmentMiddleware, etc)

要访问从ApplicationController或任何控制器设置的env变量:

if request.env[:apartment_schema_not_found]
  #handle
end

How to rescue from a OAuth::Unauthorized exception in a Ruby on Rails application?How do I access the Rack environment from within Rails?

的组合

答案 1 :(得分:3)

我们故意让Apartment非常小,以便您可以自行处理异常而无需任何特定于Rails的设置。

我会对@jenn在上面做的事做类似,但我不打算设置机架环并稍后处理它,只需在机架中完全处理响应。

例如,您可能只想重新定向到/上的SchemaNotFound

您可以执行类似

的操作
module MyApp
  class Apartment < ::Apartment::Elevators::Subdomain
    def call(env)
      super
    rescue ::Apartment::TenantNotFound
      [302, {'Location' => '/'}, []]
    end
  end
end

这是异常的原始处理。如果你需要在Rails方面发生更多事情,那么@ jenn的答案也应该有用。

查看Rack了解更多详情