2012-10-15 48 views
2

我想使用Rails的資產管道爲nginx編譯我們的自定義HTTP錯誤頁面。我還想使用佈局的標準Rails約定(例如,app/views/layouts/error.html.erb)以及在該佈局中呈現的視圖。資產管道中的預編譯HTML頁面

我發現one article describing a way to simply precompile some ERb templates,但我仍然最終複製了各種模板之間的大部分佈局代碼。

我也考慮過在控制器中使用caches_page,並簡單地強制在編譯過程中發生錯誤,以便文件最終在public,但這看起來真的很黑。

有什麼辦法可以達到這個目的嗎?

回答

4

我最終走上了哈克路線,這不像我想象的那樣哈克。

基本上,我創建了一個控制器,路線,並針對這些錯誤的模板我打算處理:

# config/routes.rb 
resources :errors, only: :show 

# app/controllers/errors_controller.rb 
class ErrorsController < ApplicationController 
    layout 'errors' 

    # you may need to disable various filters 
    skip_before_filter :authenticate_user! 

    # cache full versions of the pages we generate 
    caches_page :show 

    def show 
    render action: params[:id] 
    end 
end 

# app/views/errors/404.html.erb and so on 
<p>404 Not Found</p> 

然後,我創建了一個Rake任務「拜訪」在這些頁面中,這將導致控制器緩存的頁面中/public/errors

task :create_error_pages => :environment do 
    session = ActionDispatch::Integration::Session.new(Rails.application) 

    %w{401 404 422 ...}.each do |error| 
    session.get("/errors/#{error}") 
    end 
end 
部署期間

現在,我運行此:

RAILS_ENV=production bundle exec rake assets:precompile create_error_pages 

來生成我們的靜態HTTP錯誤頁面。

這將工作在任何環境config.action_controller.perform_caching = true。這是默認情況下在生產中,但不是在開發中,所以要注意。

+0

如果您將'config.force_ssl = true'添加到production.rb中?你需要改變get:'session.get(「/ errors /#{error}」,{},{'HTTPS'=>'on'})''。 – Jason