我有一个使用Apartment的Rails 3.2应用程序,它用作中间件。公寓引发Apartment::SchemaNotFound
例外情况,无法通过rescue_from
中的ApplicationController
进行救援。我认为我会使用this blog post中第3点所述的config.exceptions_app
,但我不能将路由器设置为异常应用,我假设我必须创建自己的。
所以问题是:我该如何处理?
答案 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了解更多详情