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