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

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

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

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

共收到 12 条回复

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

去掉 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

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

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