我有一个使用Apartment的 Rails 3.2 应用程序,它用作中间件。Apartment 抛出Apartment::SchemaNotFound
异常,无法rescue_from
从ApplicationController
. 我想我会按照这篇博config.exceptions_app
文中第 3 点的描述使用,但我不能将路由器设置为异常应用程序,我假设我必须创建自己的。
所以问题是:我该如何进行?
我们特意保留了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 的回答也应该有效。
查看机架以获取更多详细信息
我在另一个中间件抛出自定义异常时遇到了类似的问题,所以我实际上根本没有看过 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 环境?