我是个简单的人——我只想要一个可以从控制器访问的YAML配置文件。仅此而已。
首先,我创建了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
(可能在模块本身内部(?
我好像把事情搞得太复杂了。。
你让它变得比需要的复杂一点。你只需要两件事:
您的针叶树:/config/config.yml(应该看起来像这样,当然这些只是占位符(
development: &DEVELOPMENT
host_name: "localhost:3000"
api_username: test@example.com
api_pass: password
api_key: 12345
test:
<<: *DEVELOPMENT
cucumber:
<<: *DEVELOPMENT
staging:
host_name: "my-staging-staging.heroku.com"
api_username: test@example.com
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: test@example.com
api_pass: password
api_key: 12345
s3:
bucket: bucket-name
access_key_id: secret_key_id
secret_access_key: secret_key
然后您的初始值设定项:/config/iinitializers/app_config.rb
AppConfig = YAML.load(File.read(Rails.root + 'config' + 'config.yml'))[Rails.env].with_indifferent_access
现在,您可以通过AppConfig从任何地方访问配置中的任何内容。例如,在任何环境中获取主机名都是:
AppConfig[:host_name]
如果我们在本地运行,该值将是"localhost:3000">
我使用Mark Bates的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