Получить содержимое исключений в Rails Router

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

  # Errors
  %w( 404 422 500 ).each do |code|
    get code, :to => "errors#show", :code => code
  end

Единственная проблема заключается в том, что теперь я маршрутизирую ошибки, такие как потеря информации в контроллере, когда я хочу уведомить Airbrake. Как я могу сохранить информацию об исключении и отправить ее в Airbrake на 500? Прямо сейчас все, что я получаю, это env, который происходил во время исключения, который менее полезен для целей отладки.

class ErrorsController < ApplicationController

  def show
    notify_airbrake(env) 
    render status_code.to_s, :status => status_code
  end

  protected

  def status_code
    params[:code] || 500
  end

end

1 ответ

Решение

Вы обрабатываете ошибку, перенаправляя на URL-адрес, например http://your.site/500? Это будет просто HTTP-запрос, как и любой другой, теряющий контекст исключения, который вы ищете. Вместо этого вы, вероятно, хотите использовать ActionController Спасательная функциональность. Это будет выглядеть так:

class ApplicationController < ActionController::Base
  rescue_from StandardError, with: :render_error

  private

  def render_error(error)
    notify_airbrake(error)
    render text: 500, status: 500
  end
end

Вы можете добавить несколько rescue_from объявления для обработки различных видов ошибок, таких как ActiveRecord::RecordNotFound из примера руководства Rails.

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