私はハックなルートにたどり着きましたが、思ったほどハックではありませんでした。
基本的に、処理する予定のエラーのコントローラー、ルート、およびテンプレートを作成しました。
# 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
. これは本番環境ではデフォルトでオンになっていますが、開発環境ではオンになっていないため、注意してください。