我需要为我的Rails应用程序创建一个配置选项.对于所有环境都可以是相同的.我发现,如果我把它设置好environment.rb
,它可以在我的视图中使用,这正是我想要的......
environment.rb AUDIOCAST_URI_FORMAT = http://blablalba/blabbitybla/yadda
效果很好.
但是,我有点不安.这是一个很好的方法吗?有没有更时尚的方式?
对于不需要存储在数据库表中的一般应用程序配置,我喜欢config.yml
在config目录中创建一个文件.对于您的示例,它可能如下所示:
defaults: &defaults audiocast_uri_format: http://blablalba/blabbitybla/yadda development: <<: *defaults test: <<: *defaults production: <<: *defaults
此配置文件从config/initializers中的自定义初始化程序加载:
# Rails 2 APP_CONFIG = YAML.load_file("#{RAILS_ROOT}/config/config.yml")[RAILS_ENV] # Rails 3+ APP_CONFIG = YAML.load_file(Rails.root.join('config/config.yml'))[Rails.env]
如果您使用的是Rails 3,请确保不要在相对配置路径中意外添加前导斜杠.
然后,您可以使用以下方法检索值:
uri_format = APP_CONFIG['audiocast_uri_format']
有关详细信息,请参阅此Railscast.
Rails 3版本的初始化代码如下(不推荐使用RAILS_ROOT和RAILS_ENV)
APP_CONFIG = YAML.load_file(Rails.root.join('config', 'config.yml'))[Rails.env]
此外,Ruby 1.9.3使用Psych使合并键区分大小写,因此您需要更改配置文件以将其考虑在内,例如
defaults: &DEFAULTS audiocast_uri_format: http://blablalba/blabbitybla/yadda development: <<: *DEFAULTS test: <<: *DEFAULTS production: <<: *DEFAULTS
Rails> = 4.2
只需YAML
在config/
目录中创建一个文件,例如:config/neo4j.yml
.
内容neo4j.yml
可以是下面的内容(为简单起见,我在所有环境中使用默认值):
default: &default host: localhost port: 7474 username: neo4j password: root development: <<: *default test: <<: *default production: <<: *default
在config/application.rb
:
module MyApp class Application < Rails::Application config.neo4j = config_for(:neo4j) end end
现在,您可以访问自定义配置,如下所示:
Rails.configuration.neo4j['host'] #=>localhost Rails.configuration.neo4j['port'] #=>7474
更多信息
Rails官方API文档描述config_for
方法为:
方便加载当前Rails环境的config/foo.yml.
如果您不想使用yaml
文件
正如Rails官方指南所说:
您可以使用
config.x
属性下的自定义配置通过Rails配置对象配置自己的代码.
例
config.x.payment_processing.schedule = :daily config.x.payment_processing.retries = 3 config.x.super_debugger = true
然后,可以通过配置对象获得这些配置点:
Rails.configuration.x.payment_processing.schedule # => :daily Rails.configuration.x.payment_processing.retries # => 3 Rails.configuration.x.super_debugger # => true Rails.configuration.x.super_debugger.not_set # => nil
官方参考config_for
方法 |
官方Rails指南
第1步:创建config/initializers/appconfig.rb
require 'ostruct' require 'yaml' all_config = YAML.load_file("#{Rails.root}/config/config.yml") || {} env_config = all_config[Rails.env] || {} AppConfig = OpenStruct.new(env_config)
第2步:创建config/config.yml
common: &common facebook: key: 'asdjhasxas' secret : 'xyz' twitter: key: 'asdjhasxas' secret : 'abx' development: <<: *common test: <<: *common production: <<: *common
第3步:在代码中的任何位置获取常量
facebook_key = AppConfig.facebook['key'] twitter_key = AppConfig.twitter['key']
我只是想在Rails 4.2和5中更新这个最新的东西,你现在可以在任何config/**/*.rb
文件中执行此操作:
config.x.whatever = 42
(那是一个文字x
,即config.x.
字面上必须是那个,然后你可以添加你想要的任何东西x
)
...这将在您的应用中提供:
Rails.configuration.x.whatever
在此处查看更多信息:http://guides.rubyonrails.org/configuring.html#custom-configuration
关于这个主题的一些额外信息:
APP_CONFIG = YAML.load_file(Rails.root.join('config', 'config.yml'))[Rails.env].with_indifferent_access
".with_indifferent_access"允许您使用字符串键或等效符号键访问哈希值.
例如.
APP_CONFIG['audiocast_uri_format'] => 'http://blablalba/blabbitybla/yadda'
APP_CONFIG[:audiocast_uri_format] => 'http://blablalba/blabbitybla/yadda'
纯粹是一种方便的东西,但我更喜欢将我的钥匙表示为符号.
我使用类似于John for Rails 3.0/3.1的东西,但我首先解析文件:
APP_CONFIG = YAML.load(ERB.new(File.new(File.expand_path('../config.yml', __FILE__)).read).result)[Rails.env]
这允许我在我的配置中使用ERB,如果我需要,比如阅读heroku的redistogo网址:
production: <<: *default redis: <%= ENV['REDISTOGO_URL'] %>