2016-05-18 11 views
1

My Rails 4アプリは、JSON APIにはRocketPantsを、認可にはPunditを使用しています。Rails rescue_from文でRuby例外を再発生させるにはどうしたらいいですか?

Punditのエラーを処理するコードは/app/controllers/api/v1/base_controller.rbです。ユーザーがリソースを更新するために許可されていないときはいつでも、評論家はNotAuthorizedError例外をスローし、私は私のuser_not_authorized方法でそれを救う:私は私の例外ハンドラからRocketPants provideserror!メソッドを呼び出すと、私は得ることを期待

class API::V1::BaseController < RocketPants::Base 
    include Pundit 
    version 1 

    rescue_from Pundit::NotAuthorizedError, with: :user_not_authorized 

    def user_not_authorized 
    error! :forbidden 
    end 

end 

このようなJSONレスポンス:

Completed 500 Internal Server Error in 143ms 

RocketPants::Forbidden - RocketPants::Forbidden: 
    rocket_pants (1.13.1) lib/rocket_pants/controller/error_handling.rb:44:in `error!' 
    app/controllers/api/v1/base_controller.rb:61:in `user_not_authorized' 

{ 
    "error":    "forbidden", 
    "error_description": "The requested action was forbidden." 
} 

は代わりに、しかし、error!を呼び出すと、ちょうどすぐにリクエストを吹きます

フルスタックトレースhere

error!メソッドは、私のPundit例外ハンドラから呼び出されたときにどうしたらいいのですか?

コントローラの操作の途中でerror! :forbiddenを入力すると、正常に動作します。コンテキストの場合

base_controller.rbから継承し、評論家のauthorizeメソッドを呼び出して、コントローラは次のようになります。rescue_from

class API::V1::MealsController < API::V1::BaseController 

    before_filter :find_entity 

    def create 
    meal = @entity.meals.build(meal_params) 

    authorize(@entity, :update?) 

    if meal.save 
     expose meal, status: :created 
    else 
     expose meal.errors, status: 422 
    end 
    end 

end 

答えて

0

どうやら上げ例外は悪い考えで、Railsのドキュメントによると、例外が育ちハンドラがバブリングされません。

例外ハンドラ内で発生した例外は伝播されません。

ドキュメント:代わりに、再調達RocketPants'例外のhttp://api.rubyonrails.org/classes/ActiveSupport/Rescuable/ClassMethods.html

、私は単純にJSONエラーメッセージを作成して返すよ私自身:

def user_not_authorized 
    # error! :forbidden 
    head 403 
    error = { error: 'Action not allowed.', error_description: 'Sorry, you are not allowed to perform this action.'} 
    expose error 
    end 

これは動作します!ただマップ RocketPants例外に評論家の例外:私は以来さえクリーナー解決策を見つけた

UPDATE。つまり、Pundit::NotAuthorizedErrorエラーが発生した場合は、エラーRocketPants::Forbiddenとして処理されます。必要な

map_error! Pundit::NotAuthorizedError, RocketPants::Forbidden 

ませんハンドラ:

base_controller.rbの上部に単一のコード行に、ソリューション全体ダウンを手に入れました。

関連する問題