在Rails 4中的rescue_from ActionController :: RoutingError

我有以下错误:

ActionController::RoutingError (No route matches [GET] "http://img.dovov.comfavicon.ico") 

我想显示错误404页面的链接不存在。

我怎样才能做到这一点?

application_conroller.rb添加以下内容:

  # 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 

除了例外情况,我通常也会解救,但这取决于你:

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

创build错误控制器:

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

然后在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 

最后一件事是在/views/errors/下创buildnot_found.html.haml (或者你使用的任何模板引擎)

  %span 404 %br Page Not Found 

我得到这个错误。 我在app/assets/images复制favicon图像 ,并为我工作。

@Andrey Deineko,你的解决scheme似乎只适用于在一个RoutingError内部手动提出的RoutingError 。 如果我使用url my_app/not_existing_path ,我仍然得到标准的错误信息。

我想这是因为应用程序甚至没有到达控制器,因为Rails之前引发了错误。

解决问题的诀窍是在路线的末尾添加以下行:

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

捕获所有不预定义的请求。

然后在ErrorsController中,您可以使用respond_to来提供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