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