Rails预编译常量未初始化

时间:2013-04-22 14:25:11

标签: ruby-on-rails ruby-on-rails-3 initialization asset-pipeline assets

我想预加载配置(来自“.yml”文件)。在我的一个初始化文件(config / initializers / facebook.rb)中,我有以下代码行:

FACEBOOK_CONFIG = YAML.load_file("#{Rails.root}/config/facebook.yml")[Rails.env]

因此,它在“开发”模式中就像一个魅力。一旦我切换到生产模式,它一直告诉我,FACEBOOK_CONFIG是我的“facebook.js.coffee.erb”文件的未初始化常量,位于 assets / javascript (如果重要),如果我想要“耙资产:预编译”。我尝试过随机的东西,比如:RAILS_ENV=production bundle exec rake assets:precompile

  

rake assets:precompile:all

,但没有运气

我尝试为我的生产环境分配“initialize_on_precompile = true”变量(但默认情况下应该是真的),以防万一。

为什么它在生产模式下不起作用(但是,我想强调一点,它在开发环境中工作(!))。

有人可以帮助那个吗?

2 个答案:

答案 0 :(得分:4)

我遇到了完全相同的问题。这是因为您的javascript(coffescript)文件引用了初始化程序中定义的常量。因为它是在初始化程序之前预编译的,所以应用程序会抛出错误。

这是我找到的简单解决方案。您将此代码放在config:

中application.rb文件的底部
module AssetsInitializers
  class Railtie < Rails::Railtie
    initializer "assets_initializers.initialize_rails",
                :group => :assets do |app|
      require "#{Rails.root}/config/initializers/facebook.rb" 
    end
  end
end

它手动加载初始化文件夹中的某些文件。它解决了我的问题。

希望这也是你的问题。

答案 1 :(得分:0)

module Rails

  class << self
    def facebook_config
      @@facebook_config ||= nil
    end

    def facebook_config=(facebook_config)
      @@facebook_config = facebook_config
    end
  end
end

Rails.facebook_config = YAML.load_file("#{Rails.root}/config/facebook.yml")[Rails.env]

# And you can use it like this in anywhere:
puts Rails.facebook_config