2011-07-17 32 views
0

我是一個簡單的傢伙,我只想要一個可以從控制器訪問的YAML配置文件。就這樣。Rails 3 - 我的配置文件太複雜了嗎?

首先,我創建了config/app_config.yml,其中包含我想要的配置值。到現在爲止還挺好。

然後,我創建lib/app_config.rb,其中包含:

module AppConfig 
    def self.config 
    @@config ||= {} 
    end 

    def self.config=(config) 
    @@config = config 
    end 
end 

最後,我創建config/initializers/load_app_config.rb,其中包含:

# the ./ is necessary for some reason, though no examples online use it... 
require './lib/app_config' 

AppConfig.config = YAML.load_file("#{Rails.root.to_s}/config/app_config.yml") 

我應該跳過load_app_config.rb乾脆,並分配AppConfig.config其他方式(也許在模塊本身)?

看來我做它太複雜了..

回答

2

你使它成爲一個更復雜一點比它需要。你只需要兩件事情:

你conifg:/config/config.yml (應該是這個樣子的,當然這些都只是佔位符)

development: &DEVELOPMENT 
    host_name: "localhost:3000" 
    api_username: [email protected] 
    api_pass: password 
    api_key: 12345 
test: 
    <<: *DEVELOPMENT 
cucumber: 
    <<: *DEVELOPMENT 
staging: 
    host_name: "my-staging-staging.heroku.com" 
    api_username: [email protected] 
    api_pass: password 
    api_key: 12345 
    s3: 
    bucket: bucket-name 
    access_key_id: secret_key_id 
    secret_access_key: secret_key 
production: 
    host_name: "my-production.heroku.com" 
    api_username: [email protected] 
    api_pass: password 
    api_key: 12345 
    s3: 
    bucket: bucket-name 
    access_key_id: secret_key_id 
    secret_access_key: secret_key 

那麼你的初始化:/配置/初始化/ app_config.rb

AppConfig = YAML.load(File.read(Rails.root + 'config' + 'config.yml'))[Rails.env].with_indifferent_access 

現在,您可以訪問您通過AppConfig中從任何地方的任何配置。例如,要搶在任何環境下你在將主機名:

AppConfig[:host_name] 

如果我們在本地運行,該值將是「本地主機:3000」

+0

這是我的第一種方法。但是,當我嘗試這樣做時,從我的控制器訪問'AppConfig'會導致未初始化的常量錯誤。我剛剛嘗試過,並收到相同的錯誤。 'AppConfig'是否定義在特殊的地方? – ClosureCowboy

+0

AppConfig在app_config.rb中定義。當你的初始化器運行時,它應該使它可用。爲了幫助解決你的初始化程序是否正確加載,嘗試設置YAML.load(在你嘗試的控制器中的某處,設置YAML.load(Rails.root +'config'+'config.yml'))[Rails.env] .with_indifferent_access使用它並將其分配給'config'或其他東西。然後嘗試訪問config [:attribute] –

+0

也可以驗證您在/ config/initializers中的app_config.rb,而不是您在/ lib中的app_config.rb –

0

我馬克·貝茨使用configatron,這是與AppConfig方法相同,但它允許在YAML中使用ERB並且可以幫助使用命名空間:

configatron.website_url = "http://www.mackframework.com" 
configatron.email.pop.address = "pop.example.com" 
configatron.email.pop.port = 110 
configatron.email.smtp.address = "smtp.example.com" 
configatron.email.smtp.port = 25