我想使用Rails的资产管道为nginx编译我们的自定义HTTP错误页面。我还想使用布局的标准Rails约定(例如,app/views/layouts/error.html.erb
)和在该布局中呈现的视图。
我找到one article describing a way to simply precompile some ERb templates,但我仍然最终会在各种模板之间复制大部分布局代码。
我还考虑过在控制器中使用caches_page
并简单地强制在构建期间发生错误,以便文件最终在public
中,但这看起来真的很糟糕。
有没有办法实现这个目标?
答案 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
的任何环境。默认情况下,这在生产中处于启用状态,但不在开发阶段,因此请注意。