5

我想预加载配置(来自“.yml”文件)。在我的初始化文件(配置/初始化/ facebook.rb)我有代码以下行:Rails预编译常量未初始化

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

所以,它的工作原理就像在“发展”模式的魅力。一旦我切换到生产模式,它会一直告诉我,FACEBOOK_CONFIG对于我的“facebook.js.coffee.erb”文件是一个未初始化的常量,位于资产/ javascript(如果有要求),如果我想要“耙资产:预编译” 。我试着做随机的东西,如:RAILS_ENV=production bundle exec rake assets:precompile

耙资产:预编译:所有

,但没有运气

我曾尝试为分配我的生产环境“”变量(尽管默认情况下应该是这样),以防万一。

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

有人可以帮助那个吗?

+0

你的yml文件是什么样子的(当然减去你的凭证),你是在生产模式下在本地启动还是在像heroku这样的服务上失败? – 2013-12-06 01:16:13

+0

你可以试着在初始化文件中引发一个异常,看看它是否被触发?另一个要尝试的是,在初始化文件上引发一个异常,并运行一个不同的Rake任务,该任务也会加载Rails环境。尝试开发和生产环境(RAILS_ENV =生产) – htanata 2013-12-06 01:47:47

回答

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 
4

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

这是我找到的简单解决方案。你把这个代码放在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 

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

希望这也是你的问题。

+0

不确定OP是否仍在监视此问题 - 但如果这不能解决问题,我实际上会感到惊讶。我只是在这张嘴上发了50分。 – Laurent 2013-12-13 00:32:16

相关问题