Answers:
对于不需要存储在数据库表中的常规应用程序配置,我想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_ENV
与Rails.env
和RAILS_ROOT
用Rails.root
。
Rails.application.config.whatever_you_want = YAML.load_file(Rails.root.join('config', 'config.yml'))[Rails.env]
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.root.to_s}"
; "#{Rails.root}"
作品。
Rails.root.join('config', 'config.yml')
而不是"#{Rails.root.to_s}/config/config.yml"
AppName::Application.config.custom
导轨> = 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 env加载config / foo.yml的便利。
如果您不想使用yaml
文件
正如Rails官方指南所说:
您可以通过Rails配置对象使用该
config.x
属性下的自定义配置来配置自己的代码。
例
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
步骤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
x
。
You can configure your own code through the Rails configuration object with custom configuration under either the config.x namespace, or config directly. The key difference between these two is that you should be using config.x if you are defining nested configuration (ex: config.x.nested.nested.hi), and just config for single level configuration (ex: config.hello).
来源: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的东西,但是我先erb解析了该文件:
APP_CONFIG = YAML.load(ERB.new(File.new(File.expand_path('../config.yml', __FILE__)).read).result)[Rails.env]
这使我可以根据需要在配置中使用ERB,例如阅读heroku的redistogo url:
production:
<<: *default
redis: <%= ENV['REDISTOGO_URL'] %>
Rails 4
要创建自定义配置yaml并加载它(并使其对您的应用可用),类似于how database_configuration
。
创建您的*.yml
,以我为例,我需要一个redis配置文件。
config/redis.yml
default: &default
host: localhost
port: 6379
development:
<<: *default
test:
<<: *default
production:
<<: *default
host: <%= ENV['ELASTICACHE_HOST'] %>
port: <%= ENV['ELASTICACHE_PORT'] %>
然后加载配置
config/application.rb
module MyApp
class Application < Rails::Application
## http://guides.rubyonrails.org/configuring.html#initialization-events
config.before_initialize do
Rails.configuration.redis_configuration = YAML.load_file("#{Rails.root}/config/redis.yml")
end
end
end
访问值:
Rails.configuration.redis_configuration[Rails.env]
类似于您如何database.yml
通过Rails.configuration.database_configuration[Rails.env]
Rails.configuration.redis_configuration = YAML.load_file("#{Rails.root}/config/redis.yml")[Rails.env]
。但是,在Rails 4.2及更高版本中,smathy的答案可能是更简单的方法。
我喜欢simpleconfig。它使您可以按环境进行配置。
看到我对存储应用程序参数的最佳位置在哪里的回答:数据库,文件,代码...?
您所拥有的一种变体,它是对另一个文件的简单引用。它看到environment.rb并没有不断更新,并且其中没有大量应用程序特定的内容。尽管不是您“ Rails的方式吗?”这个问题的具体答案,但也许会对此进行一些讨论。
允许您在Rails初始化中使用设置并根据环境配置设置
# config/application.rb
Bundler.require(*Rails.groups)
mode = ENV['RAILS_ENV'] || 'development'
file = File.dirname(__FILE__).concat('/settings.yml')
Settings = YAML.load_file(file).fetch(mode)
Settings.define_singleton_method(:method_missing) {|name| self.fetch(name.to_s, nil)}
您可以通过两种方式获取设置: Settings ['email']或Settings.email
我最好的自定义配置方式,缺少setting.yml时会引发信息。
从config / initializers / custom_config.rb中的自定义初始化程序加载
setting_config = File.join(Rails.root,'config','setting.yml')
raise "#{setting_config} is missing!" unless File.exists? setting_config
config = YAML.load_file(setting_config)[Rails.env].symbolize_keys
@APP_ID = config[:app_id]
@APP_SECRET = config[:app_secret]
在config / setting.yml中创建一个YAML
development:
app_id: 433387212345678
app_secret: f43df96fc4f65904083b679412345678
test:
app_id: 148166412121212
app_secret: 7409bda8139554d11173a32222121212
production:
app_id: 148166412121212
app_secret: 7409bda8139554d11173a32222121212
YAML::ENGINE.yamler = 'syck'
使用它才能工作stackoverflow.com/a/6140900/414220