2

Rails のアセット パイプラインを使用して、nginx 用のカスタム HTTP エラー ページをコンパイルしたいと考えています。app/views/layouts/error.html.erbまた、レイアウト (たとえば) とそのレイアウト内でレンダリングされるビューの標準的な Rails 規則を使用したいと思います。

いくつかの ERb テンプレートを単純にプリコンパイルする方法を説明している 1 つの記事を見つけましたが、それでもさまざまなテンプレート間でレイアウト コードのほとんどをコピーすることになります。

また、コントローラーで使用caches_pageして、ビルド中にエラーを強制的に発生させて、ファイルpublicが最終的に.

これを達成する方法はありますか?

4

1 に答える 1

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. これは本番環境ではデフォルトでオンになっていますが、開発環境ではオンになっていないため、注意してください。

于 2012-10-18T01:17:57.663 に答える