本篇的作法是我參考了文末的 reference 後融合而成。

在 app/controllers/application_controller.rb ,首先在最前面加上

unless Rails.env == 'development'
  rescue_from Exception, :with => :render_500 
  rescue_from RuntimeError, :with => :render_500
  rescue_from ActiveRecord::RecordNotFound, :with => :render_404
end

然後定義 render_404 、 render_500 、 render_optional_error_file 這三個 method

def render_404
  render_optional_error_file(404)
end

def render_500
  render_optional_error_file(500)
end

def render_optional_error_file(status_code)
  status = status_code.to_s
  if ["404", "422", "500"].include?(status)
    render :template => "/errors/#{status}.html.erb", :status => status, :layout => "errors"
  else
    render :template => "/errors/unknown.html.erb", :status => status, :layout => "errors"
  end
end

打開 config/routes.rb ,寫上所有找不到頁面要處理 404 的 route

match "*other", :to => "welcome#handle404"

在 app/controllers/welcome_controller.rb 加上 handle404 action

def handle404
  render_404
end

最後把 /public/404.html, 422.html, 500.html 刪除,這樣就完成了!

 

Reference:
render_optional_error_file method
rails3定制404和500错误

Extra:
另外我後來還有找到 gem 可以處理 errors 頁面,但因為那時候 code 都寫完了所以沒有測,僅列出文章和連結提供參考
Helder Ribeiro — Dynamic Error Pages in Rails 3 with Goalie
wrangler gem
dynamic_errors gem

, , , , ,

笨笨小蟹 發表在 痞客邦 PIXNET 留言(1) 人氣()


留言列表 (1)

發表留言
  • ihower
  • 我會 prefer 保留只用靜態的 500.html,因為 render_500 搞不好也是會爆炸的 XD
  • 感謝 ihower 的意見,我最後找到的 gem 是推薦在 rack 層就處理掉... 但我沒時間再去 survey 這塊了orz所以只能有空再來更新 handle errors@@

    笨笨小蟹 於 2011/06/23 10:49 回覆