Rails Rails 3.1 的 404 500 页面怎么处理?

ywencn · 2011年12月09日 · 最后由 ywencn 回复于 2012年09月14日 · 7541 次阅读

因为那两个页面是静态的,所以以前是项目扔上去跑起来再贴个 html 到 404 和 500 里再修改,可是 rails3.1 会在 css 文件更新后把文件名也换掉,那么直接贴静态 html 肯定就不行了。

这两个页面一般怎么弄呀?那段小英文也太不友好了。 跑 github 上搜了一圈发现也是 1、2 年没维护的相关东西,那位大哥给点提示哈。

难道要写一堆各种异常捕捉?

去掉 public 目录的 404 和 500,然后建立这两个 action, 并设置 caches_page 发布的时候自动删除 public/ 里面的 404 和 500 这个也是上周 Ruby Tuesday 杭州讨论出来的小技巧

#2 楼 @huacnlee 哇不错,谢谢

由于是数字的,不能作为 action name,实现起来有点麻烦,我也还在研究

把 CSS 直接写进 404 里呢?

application controller

def render_404
  render :template => 'pages/page_not_found.html.erb', :status => 404
end

pages controller

caches_action :page_not_found, :layout => false
def page_not_found
  drop_page_title("頁面錯誤")
  render_404
end

@ywencn来顶一下校长。

在 application_controller.rb 中使用 rescue_from 可以完成大部分工作:

class ApplicationController < ActionController::Base

   def self.rescue_errors
     rescue_from Exception,                            :with => :render_error
     rescue_from RuntimeError,                         :with => :render_error
     rescue_from ActiveRecord::RecordNotFound,         :with => :render_not_found
     rescue_from ActionController::RoutingError,       :with => :render_not_found
     rescue_from ActionController::UnknownController,  :with => :render_not_found
     rescue_from ActionController::UnknownAction,      :with => :render_not_found
   end
   rescue_errors unless Rails.env.development?

   def render_not_found(exception = nil)
     render :template => "errors/404", :status => 404, :layout => 'public'
   end

   def render_error(exception = nil)
     render :template => "errors/500", :status => 500, :layout => 'public'
   end

end

但 ActionController::RoutingError 在 rails 3 中却不能得到预期结果,因为 Rails 3 使用了 Rack,Routing 的异常在 ActionDispatch::ShowExceptions 中处理了,而没有传入到 application controller 中。

BAIDU 到的这个方法不知道靠谱 不靠谱。

我现在是这么处理的,删掉 public 下的 404.html 500.html 搞一个 page_controller.rb

class PageController < ApplicationController 
  caches_page :render_404, :render_500
  def render_404
  end
  def render_500
  end
end

搞 routes

get '404.html' => "page#render_404"
get '500.html' => "page#render_500"

然后在 deploy.rb 里加上

after 'deploy:create_symlink', 'deploy:generate_404'
 task :generate_404 do 
   cmd = "curl http://domain.com/404.html;curl http://domain.com/500.html;" 
   system(cmd)
 end 

这样再发布完成后,会在 public 下生成 404.html 和 500.html

#4 楼 @huacnlee 我现在的做法也是这样...

我想问的是这个 (如图) 应该是 nginx 的吧?好久好久没见过了..感觉是在没有写这些 action 时也会生效的默认方案,是不走 rails 程序的....

从 nginx 入手多次试验未果,请问你是怎么弄出来的,thx

匿名 #11 2012年09月14日

这是 rails 的。。。nginx 是做的转发而已 蜗牛,你老先进了,哎

需要 登录 后方可回复, 如果你还没有账号请 注册新账号