with standard rails pages error ruby-on-rails ruby ruby-on-rails-4 exception-handling rescue

ruby on rails - standard - rescue_from ActionController:: RoutingError en Rails 4



rescue ruby (3)

Estaba recibiendo este error. Copié la imagen de favicon en la app/assets/images y funciona para mí.

Tengo el siguiente error:

ActionController::RoutingError (No route matches [GET] "/images/favicon.ico")

Quiero mostrar la página error404 para enlaces que no existen.

¿Cómo puedo lograr eso?


En application_conroller.rb agregue lo siguiente:

# You want to get exceptions in development, but not in production. unless Rails.application.config.consider_all_requests_local rescue_from ActionController::RoutingError, with: -> { render_404 } end def render_404 respond_to do |format| format.html { render template: ''errors/not_found'', status: 404 } format.all { render nothing: true, status: 404 } end end

Por lo general, también rescato las siguientes excepciones, pero eso depende de ti:

rescue_from ActionController::UnknownController, with: -> { render_404 } rescue_from ActiveRecord::RecordNotFound, with: -> { render_404 }

Crea el controlador de errores:

class ErrorsController < ApplicationController def error_404 render ''errors/not_found'' end end

Luego en routes.rb

unless Rails.application.config.consider_all_requests_local # having created corresponding controller and action get ''*path'', to: ''errors#error_404'', via: :all end

Y lo último es crear not_found.html.haml (o el motor de plantilla que use) en /views/errors/ :

%span 404 %br Page Not Found


@Andrey Deineko, su solución parece funcionar solo para RoutingError s planteado manualmente dentro de un Conrtoller. Si lo intento con la url my_app/not_existing_path , sigo recibiendo el mensaje de error estándar.

Supongo que esto se debe a que la aplicación ni siquiera llega a los controladores, ya que Rails plantea el error antes.

El truco que me resolvió el problema fue agregar la siguiente línea al final de las rutas:

Rails.application.routes.draw do # existing paths match ''*path'' => ''errors#error_404'', via: :all end

para atrapar todas las solicitudes no predefinidas.

Luego, en ErrorsController puede usar respond_to servir solicitudes html, json ...

class ErrorsController < ApplicationController def error_404 @requested_path = request.path repond_to do |format| format.html format.json { render json: {routing_error: @requested_path} } end end end