8

ミドルウェアとして使用されるApartmentを使用する Rails 3.2 アプリケーションがあります。アパートメントはApartment::SchemaNotFound例外をスローし、rescue_fromからでそれを救う方法はありませんApplicationControllerこのブログ投稿config.exceptions_appのポイント 3 で説明されているように使用すると思っていましたが、ルーターを例外アプリとして設定できません。独自に作成する必要があると思います。

質問は次のとおりです。どうすれば進めますか?

4

2 に答える 2

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内からラック環境にアクセスするにはどうすればよいですか?

于 2013-01-25T19:36:43.997 に答える
4

ApartmentRails固有のセットアップを実際に必要とせずに例外自体を処理できるように、意図的にかなり最小限にしています。

@jenn が上記で行っていることと同様のことを行いますが、ラック環境を設定して後で処理する必要はなく、ラックで完全に応答を処理するだけです。

/たとえば、単にリダイレクトしてon に戻したいというのは典型的なことですSchemaNotFound

次のようなことができます

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 に答える