因为那两个页面是静态的,所以以前是项目扔上去跑起来再贴个 html 到 404 和 500 里再修改,可是 rails3.1 会在 css 文件更新后把文件名也换掉,那么直接贴静态 html 肯定就不行了。
这两个页面一般怎么弄呀?那段小英文也太不友好了。 跑 github 上搜了一圈发现也是 1、2 年没维护的相关东西,那位大哥给点提示哈。
去掉 public 目录的 404 和 500,然后建立这两个 action, 并设置 caches_page 发布的时候自动删除 public/ 里面的 404 和 500 这个也是上周 Ruby Tuesday 杭州讨论出来的小技巧
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
在 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
我想问的是这个 (如图) 应该是 nginx 的吧?好久好久没见过了..感觉是在没有写这些 action 时也会生效的默认方案,是不走 rails 程序的....
从 nginx 入手多次试验未果,请问你是怎么弄出来的,thx