在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