Фон
У меня есть приложение, которое я недавно обновил до Rails 3.2.1 (от Rails 3.0.x) и переработал активы JS и CSS, чтобы использовать новый конвейер активов. Приложение размещено на Heroku с помощью стеллажа Celadon Cedar.
Конфигурация приложения
Я сохраняю конкретную конфигурацию приложения в файле YAML с именем app_config.yml и загружаю его в глобальную переменную 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 поддерживает конвейер ресурсов Rails, встроенный в стек кедра. Когда вы нажимаете приложение в Heroku, он автоматически вызывает rake assets:precompile
на сервере в качестве шага в процессе развертывания. Однако он делает это в изолированной среде без доступа к базе данных или нормальных ENV-vars.
Если приложению разрешено нормально инициализировать во время предварительной компиляции актива, возникает ошибка, связанная с подключением к базе данных. Это легко решить, добавив следующее в файл application.rb:
# Do not load entire app when precompiling assets
config.assets.initialize_on_precompile = false
Моя проблема
Когда initialize_on_precompile = false
установлен, ни один из инициализаторов в config/initializers/*
не запускается. Проблема, с которой я сталкиваюсь, заключается в том, что мне нужно, чтобы переменная APP_CONFIG была доступна во время предварительной компиляции ресурсов.
Как я могу получить load_app_config.rb
для загрузки во время компиляции активов без инициализации всего приложения? Могу ли я что-то сделать с параметром group
, переданным в Rails:: Application.initialize!