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