私はRailsとバックエンドAPIの開発にはかなり新しいので、私が概念を誤用すると私は言い訳になります。今私は、コードベースの周りに振り回され、APIコントローラに混在している救済された例外の明示的なリストをモジュールとして組み込むことに向けて、多量の条件付きエラー処理コードをリファクタリングしようとしています。これにより、アクティブなレコードメソッドにバンオプションを使用し、エラー処理コードを1つの場所に置くことができる限り、捕捉された各例外にカスタムの、ただし任意のコードを付加できます。これまでのところ、エラー処理モジュールのために、私はこのようなものを持っている:layouts/api/errors
はJBuilderのを使用して構築された図であるRailsでモジュールを使ってエラーを処理する最も良い方法は?
# app/lib/error/error_handling.rb
module Error
module ErrorHandling
def self.included(klass)
klass.class_eval do
rescue_from ActiveRecord::RecordNotFound do |e|
respond(:record_not_found, 404, e.to_s)
end
rescue_from ActiveRecord::ActiveRecordError do |e|
respond(e.error, 422, e.to_s)
end
rescue_from ActiveController::ParameterMissing do |e|
response(:unprocessable_entitry, 422, e.to_s)
end
rescue_from ActiveModel::ValidationError do |e|
response(e.error, 422, e.to_s)
end
rescue_from CustomApiError do |e|
respond(e.error, e.status, e.message.to_s)
end
rescue_from CanCan::AccessDenied do
respond(:forbidden, 401, "current user isn't authorized for that")
end
rescue_from StandardError do |e|
respond(:standard_error, 500, e.to_s)
end
end
end
private
def respond(_error, _status, _message)
render "layouts/api/errors", status: _status
end
end
end
。我々が持っているApiController
で :
# app/controllers/api/api_controller.rb
module Api
class ApiController < ApplicationController
include Error::ErrorHandling
attr_reader :active_user
layout "api/application"
before_action :authenticate_by_token!
before_action :set_uuid_header
respond_to :json
protect_from_forgery with: :null_session
skip_before_action :verify_authenticity_token, if: :json_request?
private
...
end
残念ながら、これは動作するようには思えません。テストを実行すると、プライベートメソッドはまったく読み込まれておらず、未定義とみなされます。ここでは、より具体的には
は、放出されたエラーです:
uninitialized constant Error::ErrorHandling::ActiveController
と
active_user
が
set_active_user
という名前のメソッドによって、インスタンス変数の内部で設定されている属性である
undefined local variable or method `active_user' for Api::FooController
。明らかに呼び出されていないのは明らかです。
しかし、ErrorHandling
モジュールが評価されています。これはどうやってできるの?名前空間が間違っているのですか?
読んでいただきありがとうございます。
どのプライベートメソッドが未定義であるかを詳しく教えてください。コントローラのオンまたはモジュールのオン?可能であれば、スタックトレースも役に立ちます。 – ulferts
投稿を更新しました。前述したように、モジュールは評価されていますが、実際に定義されていると、モジュール内の 'unitialized constant'エラーと、' undefined local variableまたは 'メソッドがAPIコントローラの内部にあります。おそらくモジュールのエラーは、 'include'以下のコードが評価されないようにしますか? – dynsne
私は「未定義メソッド」の問題に関する基本的なポインタしか提供できませんでした。エラーを発生させるコードを表示すると、より具体的なヘルプを提供することができます。 – ulferts