在资产管道中预编译HTML页面

时间:2012-10-15 21:29:44

标签: ruby-on-rails ruby-on-rails-3.2 asset-pipeline

我想使用Rails的资产管道为nginx编译我们的自定义HTTP错误页面。我还想使用布局的标准Rails约定(例如,app/views/layouts/error.html.erb)和在该布局中呈现的视图。

我找到one article describing a way to simply precompile some ERb templates,但我仍然最终会在各种模板之间复制大部分布局代码。

我还考虑过在控制器中使用caches_page并简单地强制在构建期间发生错误,以便文件最终在public中,但这看起来真的很糟糕。

有没有办法实现这个目标?

1 个答案:

答案 0 :(得分: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的任何环境。默认情况下,这在生产中处于启用状态,但不在开发阶段,因此请注意。