Стратегия обработки ошибок винограда?

Я использую 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 остается довольно скудным. Я все еще очень открыт для любых других подходов, которые могут быть у людей.

Другие вопросы по тегам