Tratamento de erros do Rails 3.2 com exceptions_app

Renderize páginas de erro legais em produção com o Rails 3.2.
Desde o Rails 3 você não pode lidar diretamente com exceções na camada de middleware, como RoutingError, em seu controlador (por exemplo, com o resgate do auxiliar). Rails 3.2. permite configurar um aplicativo de exceções , que será usado no modo de produção para lidar com suas exceções.

Use Routes Engine como exceptions_app
Você pode usar o Routes Engine como exceptions_app com uma configuração simples em application.rb

class Application < Rails::Application
...
config
.exceptions_app = self.routes
...
end

Agora você pode simplesmente encaminhar suas exceções para o ExceptionController

MyApp::Application.routes.draw do
...
match
'/404', :to => "exceptions#render_404"
...
end

Use o aplicativo Rack personalizado como exceptions_app
Você pode usar qualquer aplicativo Rack como aplicativo de exceções . Já que um controlador Rails é basicamente um aplicativo Rack, você também pode usar seu ExceptionController diretamente como aplicativo de exceções . Use uma expressão lambda, porque a constante do nome do controlador ainda não está disponível no estágio de inicialização.

class Application < Rails::Application
...
config
.exceptions_app = lambda do |env|
ExceptionController.action(:render_error).call(env)
end
...
end

Obtenha diagnósticos de exceção em seu controlador
Em seu controlador, você pode obter facilmente as propriedades da exceção (por exemplo, statuscode).

class ExceptionController < ActionController::Base
layout
'application'

def render_error
@exception = env["action_dispatch.exception"]
@status_code = ActionDispatch::ExceptionWrapper.new(env, @exception).status_code
render
:error_page, status: @status_code, layout: true
end
end