ruby-on-rails-3 - 执行 Rails Assets :precompile? 时如何运行一些初始化程序

标签 ruby-on-rails-3 ruby-on-rails-3.1 heroku asset-pipeline ruby-on-rails-3.2

背景

我有一个最近更新到 Rails 3.2.1(来自 Rails 3.0.x)的应用程序,并重构了 JS 和 CSS Assets 以利用新的 Assets 管道。该应用程序使用 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 上的 Assets 编译

Heroku 支持 Cedar 堆栈中内置的 Rails Assets 管道。当您将应用程序推送到 Heroku 时,它会自动调用 rake assets:precompile在服务器上作为部署过程中的一个步骤。但是,它在没有数据库访问或正常 ENV 变量的沙盒环境中执行此操作。

如果允许应用程序在 Assets 预编译期间正常初始化,则会在尝试连接到数据库时抛出错误。这很容易通过将以下内容添加到 application.rb 文件中来解决:
    # Do not load entire app when precompiling assets
    config.assets.initialize_on_precompile = false

我的问题

initialize_on_precompile = false已设置,config/initializers/* 中没有任何初始化程序正在运行。我遇到的问题是我需要 APP_CONFIG 变量在 Assets 预编译期间可用。

我怎样才能得到load_app_config.rb在 Assets 编译期间加载而不初始化整个应用程序?我可以用 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 是否已定义,因为它只会在 Assets 组中运行。

您可以(并且应该)继续使用 initialize_on_precompile = false . load_config.rb 初始化程序将在初始化应用程序时运行(因为它在 config/initializers 中)以及在没有初始化的情况下进行预编译(因为上面的代码)。

关于ruby-on-rails-3 - 执行 Rails Assets :precompile? 时如何运行一些初始化程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9235292/

相关文章:

ruby-on-rails-3 - 在 Rails 模板的末尾显示一条消息

ruby-on-rails - 轻量级 Rails 3 所见即所得编辑器

ruby-on-rails - 在 coffeescript 中获取 rails view helper 方法

ruby-on-rails - 如何让我的暂存和生产具有相同的数据? (英雄)

ruby-on-rails - Ruby on Rails 应用程序的分离

ruby-on-rails - 向大量收件人发送电子邮件的最佳实践 (Rails + SendGrid)

ruby - 属性值无

ruby-on-rails - rails 服务器抛出 `require' : cannot load such file -- bigdecimal/util (LoadError)

ruby-on-rails-3 - 使用延迟作业发送电子邮件时报告错误

ruby-on-rails - 在 Rails 中内联渲染