[英]rescue_from ActionController::RoutingError in Rails 4
I've got the following error:我有以下错误:
ActionController::RoutingError (No route matches [GET] "/images/favicon.ico")
I want to show error404 page for links that are not existing.我想为不存在的链接显示 error404 页面。
How can I achieve that?我怎样才能做到这一点?
In application_controller.rb
add the following:在
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
I usually also rescue following exceptions, but that's up to you:我通常也会拯救以下异常,但这取决于你:
rescue_from ActionController::UnknownController, with: -> { render_404 }
rescue_from ActiveRecord::RecordNotFound, with: -> { render_404 }
Create the errors controller:创建错误控制器:
class ErrorsController < ApplicationController
def error_404
render 'errors/not_found'
end
end
Then in routes.rb
然后在
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
And the last thing is to create not_found.html.haml
(or whatever template engine you use) under /views/errors/
:最后一件事是在
/views/errors/
下创建not_found.html.haml
(或您使用的任何模板引擎):
%span 404
%br
Page Not Found
@Andrey Deineko, your solution seems to work only for the RoutingError
s raised manually inside a conrtoller. @Andrey Deineko,您的解决方案似乎仅适用于在
RoutingError
内手动引发的RoutingError
s。 If I try it with the url my_app/not_existing_path
, I still get the standard error message.如果我使用 url
my_app/not_existing_path
尝试它,我仍然收到标准错误消息。
I guess this is because the application doesn't even reach the controllers, since Rails raises the error before.我想这是因为应用程序甚至没有到达控制器,因为 Rails 之前引发了错误。
The trick that solved the problem for me was to add the following line at the end of the routes:
为我解决问题的技巧是在路线的末尾添加以下行:
Rails.application.routes.draw do
# existing paths
match '*path' => 'errors#error_404', via: :all
end
to catch all not predefined requests.捕获所有未预定义的请求。
Then in the ErrorsController you can use respond_to
to serve html, json... requests:然后在 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
在app/assets/images
复制网站图标图像对我有用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.