8

我有一个使用Apartment的 Rails 3.2 应用程序,它用作中间件。Apartment 抛出Apartment::SchemaNotFound异常,无法rescue_fromApplicationController. 我想我会按照这篇博config.exceptions_app文中第 3 点的描述使用,但我不能将路由器设置为异常应用程序,我假设我必须创建自己的。

所以问题是:我该如何进行?

4

2 回答 2

4

我们特意保留了Apartment非常少的内容,以允许您自己处理异常,而无需任何 Rails 特定设置。

我会做类似于上面@jenn 所做的事情,但我不会费心设置机架环境并稍后处理它,只需在机架中完全处理响应即可。

例如,您可能只想重定向回/onSchemaNotFound

你可以做类似的事情

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

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

查看机架以获取更多详细信息

于 2013-12-02T16:37:45.357 回答
4

我在另一个中间件抛出自定义异常时遇到了类似的问题,所以我实际上根本没有看过 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 或任何控制器设置的环境变量:

if request.env[:apartment_schema_not_found]
  #handle
end

如何从 Ruby on Rails 应用程序中的 OAuth::Unauthorized 异常中解救的组合以及如何从 Rails 中访问 Rack 环境?

于 2013-01-25T19:36:43.997 回答