完美自定义errors page

作者:周星 发布:2017-10-07

       之前的文章公益404介绍了如何在网站中加入公益404,这次分享我们来看一下如何完美自定义自己的 errors page,而不用 rails public 文件夹下默认的 errors page。

首先,你最好删除 public 目录下的404.html、500.html、422.html,然后修改配置:

# config/application.rb   
config.exceptions_app = self.routes

这样项目发生错误时就会在 routes 里寻找,而不在 public 目录下寻找了。

修改了配置之后,我们要在路由中定义错误页面的路由

# config/routes.rb
%w(404 422 500).each do |code|
  get code, to: "errors#show", code: code
end

如果您对上面代码有一丝丝的疑惑,请重新翻看 rails route 部分相关知识或者联系作者

路由加好之后,我们就要写对应的 controller 文件了

class ErrorsController < ApplicationController
  def show
    render status_code.to_s, status: status_code
  end

protected

  def status_code
    params[:code] || 500
  end

end

然后新建 errors 文件夹,并写好对应的 view

mkdir app/views/errors
vi 404.html.erb
vi 500.html.erb
vi 422.html.erb

想让所有错误的、不存在的路由都到 404 页面中去,您可以这样做

# routes.rb
match "*path" => "errors#404"

友情提示,上面的代码要加在你想 match 的 scope 的最下面

有些时候, show action 通过 url 中的参数无法从数据库中找到数据,rails 会报 500 错,实际上这是不应该的,我们把它转向我们自定义的 404 页面中去,以本站为例,当你在 blogs/ 后面随便输入一段字符,如果数据中没有找到,会转到 404 界面。

# application_controller.rb
def render_404_page
  respond_to do |format|
    format.xml { render :xml => { :error => 'Not found' }, :status => 404 }
    format.html { render template: 'errors/404', status: 404, layout: 'static' }
  end
end

然后在需要转向 404 界面的 action 里直接使用,例如:

# blogs_controller.rb
@blog = Blog.find_by_url_name(params[:id])
if @blog.nil?
  render_404_page
else
  # 略
end

一个简单调试 errors 界面的方法:直接在域名后面加 404.html、500.html 或 422.html 即可。

注意:因为定义后的 404 界面为动态页面,所以如果 404 界面本身有问题,会转向 500 界面,需要谨慎调试

本站还是有点用心的做了错误界面,您可以点击下面的链接访问:

starzhou.com/404.html

starzhou.com/500.html

starzhou.com/422.html

如果您对本站有什么意见或建议,请联系作者

支付宝扫码赞助博主


评论(0)