我需要为我的Rails应用程序创建一个配置选项。对于所有环境都可以是相同的。我发现如果我在environment.rb
中设置它,它在我的视图中可用,这正是我想要的...
environment.rb
AUDIOCAST_URI_FORMAT = http://blablalba/blabbitybla/yadda
效果很好。
但是,我有点不安。这是一个很好的方法吗?有没有更时尚的方式?
对于不需要存储在数据库表中的一般应用程序配置,我喜欢在config目录中创建一个config.yml
文件。对于您的示例,它可能如下所示:
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']
有关详细信息,请参阅this Railscast。
我喜欢AppConfig[:twitter][:key]
。它允许您进行每个环境配置。
看看我对simpleconfig的回应
你所拥有的变化,它是对另一个文件的简单引用。它看到environment.rb不是经常更新的,并且没有一堆应用程序特定的东西。虽然不是对你的“Rails方式是什么?”问题的具体答案,但也许会有一些关于那个问题的讨论。
我更喜欢通过全局应用程序堆栈访问设置。我在本地范围内避免了多余的全局变量。
配置/初始化/ myconfig.rb
Where is the best place to store application parameters : database, file, code...?
并访问它。
MyAppName::Application.define_singleton_method("myconfig") {YAML.load_file("#{Rails.root}/config/myconfig.yml") || {}}
允许您在Rails初始化中使用设置并配置每个环境的设置
MyAppName::Application.myconfig["yamlstuff"]
您可以通过两种方式获取设置:设置['email']或Settings.email
我最好的自定义配置方式,当setup.yml丢失时带有raise消息。
从config / initializers / custom_config.rb中的自定义初始化程序加载
# 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)}
在config / setting.yml中创建一个YAML
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]
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
Official Reference for config_for
method | Official Rails Guide
第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'] %>
Rails 4
要创建自定义配置yaml并加载它(并使其适用于您的应用),类似于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]
类似于你如何通过qazxswpoi访问你的database.yml
在Omer Aslam的优雅解决方案的基础上,我决定将密钥转换为符号。唯一的变化是:
Rails.configuration.database_configuration[Rails.env]
这允许您然后通过符号作为键引用值,例如
all_config = YAML.load_file("#{Rails.root}/config/config.yml").with_indifferent_access || {}
这似乎更贴近我的眼睛。
(作为答案发布,因为我的声誉不足以评论Omer的回复)