在Rails 4中,rescue_from ActionController :: RoutingError

时间:2014-09-15 05:33:03

标签: ruby-on-rails ruby ruby-on-rails-4 exception-handling rescue

我遇到以下错误:

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

我想为不存在的链接显示error404页面。

我怎样才能做到这一点?

3 个答案:

答案 0 :(得分:55)

application_controller.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  }

创建错误控制器:

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

最后一件事是在not_found.html.haml下创建/views/errors/(或您使用的任何模板引擎):

  %span 404
  %br
  Page Not Found

答案 1 :(得分:2)

@Andrey Deineko,您的解决方案似乎只适用于在conrtoller中手动引发的RoutingError。如果我使用网址my_app/not_existing_path进行尝试,我仍会收到标准错误消息。

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

为我解决问题的trick是在路线的 end 添加以下行:

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

答案 2 :(得分:1)

我收到了这个错误。我在app/assets/images中复制了 favicon图片,并为我工作。