背景
我有一个应用程序,最近更新到了 Rails 3.2.1(从 Rails 3.0.x),并重构了 JS 和 CSS 资源以利用新的资源管道。该应用程序托管在具有 Celadon Cedar 堆栈的 Heroku 上。
应用程序配置
我将应用程序特定的配置保存在名为 app_config.yml 的 YAML 文件中,并使用初始值设定项将其加载到全局 APP_CONFIG 变量中:
# config/initializers/load_app_config.rb
app_config_contents = YAML.load_file("#{Rails.root.to_s}/config/app_config.yml")
app_config_contents["default"] ||= {}
APP_CONFIG = app_config_contents["default"].merge(
app_config_contents[Rails.env] || {} ).symbolize_keys
Heroku 上的资产编译
Heroku 支持内置于 Cedar 堆栈中的 Rails 资产管道。当您将应用程序推送到 Heroku 时,它会自动调用rake assets:precompile
作为部署过程中的一个步骤在服务器上进行。然而,它是在没有数据库访问或普通 ENV 变量的沙盒环境中执行此操作的。
如果允许应用程序在资产预编译期间正常初始化,则会在尝试连接数据库时引发错误。通过将以下内容添加到 application.rb 文件中可以轻松解决此问题:
# Do not load entire app when precompiling assets
config.assets.initialize_on_precompile = false
我的问题
When initialize_on_precompile = false
设置后,中没有任何初始化程序config/initializers/*
正在运行。我遇到的问题是我需要 APP_CONFIG 变量在资产预编译期间可用。
我怎样才能得到load_app_config.rb
在资产编译期间加载而不初始化整个应用程序?我可以用group
参数传递给 Rails::Application.initialize! ?
Rails 允许您仅在某些组中注册初始化程序,但您需要使用 Railtie API:
# in config/application.rb
module AssetsInitializers
class Railtie < Rails::Railtie
initializer "assets_initializers.initialize_rails",
:group => :assets do |app|
require "#{Rails.root}/config/initializers/load_config.rb"
end
end
end
您不需要检查 AppConfig 是否已定义,因为它只会在资产组中运行。
并且您可以(并且应该)继续使用initialize_on_precompile = false
。 load_config.rb 初始化程序将在初始化应用程序时运行(因为它位于config/initializers
) and当预编译而不初始化时(因为上面的代码)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)