Переопределить формат json по умолчанию для ошибок в Rails API - PullRequest
0 голосов
/ 13 сентября 2018

Когда возникает ошибка только в Rails API, сервер отвечает с ошибкой в ​​json в следующем формате: {"status":500,"error":"Internal Server Error"}.

Формат одинаков и для других ошибок: {"status":404,"error":"Not Found"}.

Я хочу отобразить ошибки в формате: {"errors": [{status: 404, title: "Not found"}]}.

По сути, я хочу изменить формат всех ошибок, чтобы они были одинаковыми, и я не могу найти способ сделать это.

Я знаю, что могу использовать (например) rescue_from ActiveRecord::RecordNotFound, with: :my_method и переопределить отдельные исключения, но это означает, что мне нужно перечислить все возможные исключения и вернуть соответствующий код, когда Rails уже делает это.

Я ищу метод, который можно переопределить и который я могу использовать для изменения формата ошибок по умолчанию в Rails.

Ответы [ 2 ]

0 голосов
/ 21 сентября 2018

Вы можете настроить исключение_app в Rails .

Промежуточное ПО по умолчанию, которое управляет исключениями и отображает ошибки: ActionDispatch::PublicExceptions.

Прежде всего, нужно переопределить это промежуточное ПО для реализации нашего пользовательского поведения. Внутри папки app/middlewares/action_dispatch создайте файл public_exceptions_plus.rb со следующим:

module ActionDispatch
  class PublicExceptionsPlus < PublicExceptions
    def call(env)
      request = ActionDispatch::Request.new(env)
      status = request.path_info[1..-1].to_i
      content_type = request.formats.first
      # define here your custom format
      body = { errors: [{ status: status,
                          title: Rack::Utils::HTTP_STATUS_CODES.fetch(status, Rack::Utils::HTTP_STATUS_CODES[500]) }] }

      render(status, content_type, body)
    end
  end
end

после этого, внутри config/application.rb добавить следующее:

 config.exceptions_app = ->(env) { ActionDispatch::PublicExceptionsPlus.new(Rails.public_path).call(env) }

Спасибо @ smallbutton.com за вклад. Я думаю, что это лучшее решение, так как оно не требует контроллера, а только промежуточного программного обеспечения.

0 голосов
/ 17 сентября 2018

Лучший способ сделать это в Rails - это, вероятно, определение exceptions_app (см. config.exceptions_app), которое должно быть пользовательским стоечным приложением. Это позволит вам визуализировать ваши исключения по вашему выбору. Пример здесь .

config.exceptions_app = ->(env) { ErrorsController.action(:show).call(env) }

class ErrorsController < ApplicationController
  layout 'error'

  def show
   exception       = env['action_dispatch.exception']
   status_code     = ActionDispatch::ExceptionWrapper.new(env, exception).status_code

   # render whatever you want here
  end
end

Вы также можете проверить, какова реализация по умолчанию по рельсам.

Существует также камень под названием exception_handler, который может быть альтернативой здесь. Дополнительные ресурсы: https://devblast.com/b/jutsu-12-custom-error-pages-in-rails-4

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...