Стратегия обработки ошибок винограда?
Я использую Grape и Rails для создания REST API. У меня есть базовая архитектура, и я ищу места для "очистки" вещей. Одним из таких мест является обработка / обработка ошибок.
В настоящее время я спасаю ошибки в файле root.rb (базовый класс GRAPE::API) для всего API. Я форматирую их и затем отправляю ошибку обратно через rack_response. Все работает, но файл root.rb становится немного раздутым, и все ошибки устраняются, и некоторые из них требуют специального анализа, который необходимо выполнить. Мне было интересно, разработал ли кто-нибудь хорошую стратегию для обработки ошибок, чтобы ее можно было перенести в свой собственный модуль и оставить root.rb (базовый класс GRAPE::API) довольно скудным.
Я действительно хотел бы создать модуль обработки ошибок и определить методы для каждого типа ошибок, например...
module API
module ErrorHandler
def record_not_found
rack_response API::Utils::ApiErrors.new({type: e.class.name, message: 'Record not found'}).to_json, 404
end
end
end
Затем в файле root.rb сделайте что-то подобное
module API
class Root < Grape::API
prefix 'api'
format :json
helpers API::ErrorHandler
rescue_from ActiveRecord::RecordNotFound, with: :record_not_found # Use the helper method as the handler for this error
end
end
Кто-нибудь сделал что-то подобное? Я пробовал различные варианты вышеуказанной стратегии, но я не могу заставить себя работать.
1 ответ
Я пришел к следующему решению / стратегии...
Я перенес всю ошибку спасения в свой собственный модуль, как показано ниже
module API
module Errors
extend ActiveSupport::Concern
included do
rescue_from :all do |e|
rack_response API::Utils::ApiErrors.new({type: e.class.name, message: e.message}).to_json, 500
end
.
.
.
end
end
Затем я просто включаю ошибки в свой базовый класс GRAPE::API
module API
class Root < Grape::API
include API::Errors
prefix 'api'
format :json
helpers API::Utils::Helpers::IndexHelpers
helpers API::Utils::Helpers::WardenHelpers
helpers API::Utils::Helpers::RecordHelpers
.
.
.
end
end
После долгих экспериментов и множества других попыток не работает, я думаю, что это хорошее решение, и мой базовый класс GRAPE::API остается довольно скудным. Я все еще очень открыт для любых других подходов, которые могут быть у людей.