其次,我计划为我的应用程序中的上载提供S3支持,如果我想添加一个具有s3访问,密钥的yaml文件,如何在Rails App中初始化它,并如何访问在该配置文件中定义的值。
#1 楼
Update 1非常推荐:我现在使用Rails Config gem,以提供它提供的细粒度控制。
Update2
如果需要快速解决方案,然后检查下面的杰克·普拉特(Jack Pratt)的答案。
尽管我下面的原始答案仍然有效,但此答案现在已过时。我建议查看更新1和2。
原始答案:
对于快速解决方案,观看Ryan Bates投放的“ YAML配置文件”屏幕应该会非常有帮助。
摘要:
# config/initializers/load_config.rb
APP_CONFIG = YAML.load_file("#{Rails.root}/config/config.yml")[Rails.env]
# application.rb
if APP_CONFIG['perform_authentication']
# Do stuff
end
评论
这个答案已经过时了。请参阅下面的stackoverflow.com/questions/1450285/…
–马特维恩
2011年5月27日15:35
@matt:是因为过时的Rails 3发行了,还是因为每个人现在都在Rails 3中发行了?
–拉瑟·V·卡尔森(Lasse V. Karlsen)
2011年5月27日19:54
感谢您指出过时的内容。我讨厌Rails-1年前的代码太旧了。
– jcollum
2011-12-15 23:16
对于任何想在Rails 3+中使用YAML方法的人,都必须用Rails.env替换RAILS_ENV,用Rails.root替换RAILS_ROOT。
–瑞安
2012年5月17日18:47
我尝试了rails_config。他们在文档中指示我在我的app.rb中注册RailsConfig。我假设app.rb = config / application.rb。但是,应在application.rb中的哪个位置放RailsConfig行?
–NhímHổBáo
15年4月8日在19:58
#2 楼
在Rails 3中,可以将应用程序特定的自定义配置数据放置在应用程序配置对象中。可以在初始化文件或环境文件中分配配置-例如对于给定的应用程序MyApp
:MyApp::Application.config.custom_config_variable = :my_config_setting
或
br />
要读取设置,只需调用配置变量而不对其进行设置:
Rails.configuration.custom_config_variable = :my_config_setting
UPDATE Rails 4
在Rails 4提供了一种新的方法=> http://guides.rubyonrails.org/configuring.html#custom-configuration
评论
这个对我有用。我将特定于环境的配置设置放在环境/{environment}.rb中,例如,环境/development.rb。确保修改后重新启动服务器。可能会有更优雅的技术,但是我正在升级以前在同一文件中使用过ENV ['XXX']的现有应用程序,并且由于我想限制升级期间的重构量,因此效果很好。
– pduey
2011年4月26日在16:13
这是分配,但是您如何访问该值?
–kevzettler
2011年8月10日16:39
如果您查看rails 3.x应用程序的application.rb,则根据此答案说“应将应用程序配置放入config / initializers中的文件中”。关于如何访问变量,有很多文档(edgeguides.rubyonrails.org/configuring.html)。例如在初始化程序文件夹中名为some_variables.rb的文件中,按上述方式放置变量(将MyApp替换为应用程序的名称),然后在要使用它时,只需调用config.custom_config_variable您当然可以使用所需的任何变量名。 @Jack Pratt您可以编辑一个更完整的答案吗?
–詹姆斯
2011年8月31日14:58
简单的花花公子:路径:config / environments / production.rb配置:config.whatever = false可以在任何地方访问它:Rails.configuration.whatever
– Victor S
2012年1月1日23:26
请注意,如果仅在生产环境中设置某些内容,并尝试在其他环境中访问它,则会抱怨未定义的方法。
–卢拉拉拉
2012-03-15 10:44
#3 楼
在Rails 3.0.5中,以下方法对我有用:在
config/environments/development.rb
中,编写config.custom_config_key = :config_value
然后可以从其他使用
Rails.application.config.custom_config_key
的文件
评论
请注意,如果仅在生产环境中设置某些内容,并尝试在其他环境中访问它,则会抱怨未定义的方法。
–卢拉拉拉
2012年3月15日上午10:45
我在Rails 4.1中对此进行了尝试,但出现错误,“ ... method_missing':#
– Spundun
2014年3月19日在21:52
@Spundun您会收到该错误,因为Rails不知道什么是商店。为了在此答案中使用该方法,您可以重命名变量store_works,或创建一个其中定义了作品的config.store块。
–Paul Pettengill
2014年8月21日在18:16
谢谢,我终于明白了。这些是嵌套哈希,因此如果要在配置名称中使用点,则必须递归初始化空哈希。
– Spundun
2014年8月21日在18:48
#4 楼
可以在rails 3.1:config / environment.rb中(或在config / environments / ..中以特定环境为目标):
YourApp::Application.config.yourKey = 'foo'
可以在控制器或类似这样的视图中访问:
YourApp::Application.config.yourKey
(您的应用程序名称应替换为您的应用。)
注意:这是Ruby代码,因此,如果您有很多配置键,则可以在config / environment.rb中执行以下操作:
:
YourApp::Application.configure do
config.something = foo
config.....
config....
.
config....
end
评论
camelCase:o使用snake_case!
– siegy22
17年4月24日在19:41
#5 楼
在Rails 4中假设您将自定义变量放入yaml文件中:
# config/acme.yml
development:
:api_user: 'joe'
:api_pass: 's4cret'
:timeout: 20
创建一个初始化程序以加载它们:
# config/initializers/acme.rb
acme_config = Rails.application.config_for :acme
Rails.application.configure do
config.acme = ActiveSupport::OrderedOptions.new
config.acme.api_user = acme_config[:api_user]
config.acme.api_pass = acme_config[:api_pass]
config.acme.timeout = acme_config[:timeout]
end
现在在应用程序中的任何位置,您都可以访问以下值:您的
Rails.application.config_for :acme
并使用正确的环境。#6 楼
从Rails 4.2开始,没有其他gem,您只需使用Rails.application.config_for :hi
即可加载config / hi.yml。例如,touch config/passwords.yml
#config/passwords.yml
development:
username: 'a'
password: 'b'
production:
username: 'aa'
password: 'bb'
touch config/initializers/constants.rb
#config/initializers/constants.rb
AUTHENTICATION = Rails.application.config_for :passwords
现在您可以在应用程序中的任何地方使用
AUTHENTICATION
常量:#rails c production
:001> AUTHENTICATION['username'] => 'aa'
然后将passwords.yml添加到.gitignore:
echo /config/passwords.yml >> .gitignore
,创建一个舒适的示例文件cp /config/passwords.yml /config/passwords.example.yml
,然后只需在生产控制台中使用实际生产值编辑示例文件即可。#7 楼
我只是想将其更新为Rails 4.2中的最新功能,现在您可以在任何config/**/*.rb
文件中执行此操作:config.x.whatever.you.want = 42
...这将在您的应用中可以通过以下方式获得:
Rails.configuration.x.whatever.you.want
在此处查看更多信息:http://guides.rubyonrails.org/configuring.html#custom-configuration
#8 楼
看看这个整洁的宝石到底是做什么的:https://github.com/mislav/choices
这样,您的敏感数据就不会在开源项目中公开
#9 楼
我为YAML设置创建了一个简单的插件:Yettings它的工作方式与khelll的答案中的代码类似,但是您只需要添加以下YAML配置文件:
app/config/yetting.yml
插件动态创建一个类,该类允许您以应用程序中的类方法访问YML设置,如下所示:
Yetting.your_setting
也,如果要使用具有唯一名称的多个设置文件,可以将它们放置在app / config内的子目录中,如下所示:
app/config/yettings/first.yml
app/config/yettings/second.yml
然后您可以访问值像这样:
FirstYetting.your_setting
SecondYetting.your_setting
它还为您提供了默认设置,每个环境都可以覆盖这些默认设置。您还可以在yml文件中使用erb。
评论
官方回购现在位于:github.com/charlotte-ruby/yettings(SO审阅者拒绝了我的编辑,说它太小了)
–卢拉拉拉
13年3月6日在10:05
#10 楼
我真的很喜欢settingslogic的宝石。非常容易设置和使用。https://github.com/binarylogic/settingslogic
评论
到目前为止爱这个。将您的设置对象放在app / models / settings.rb中,您也可以在开发人员模式下重新加载。赢得!
–马特·沙弗(Mat Schaffer)
2011年11月7日在16:41
#11 楼
如果您使用Heroku或其他需要将应用程序设置保留为环境变量,则figaro gem非常有用。#12 楼
我喜欢将rails-settings用于需要通过Web界面更改的全局配置值。评论
我想使用其他插件等,因为我正在学习Rails,所以最好的方法是没有任何插件。
– Shiv
09年9月20日在16:09
请注意,这使用数据库来存储配置,这对于某些人来说可能太重了。
–卢拉拉拉
13年3月6日在9:26
#13 楼
我们开始在工作中使用的是ActiveSupport Ordered Hash,它允许您在环境文件中清晰地定义配置,例如
config.service = ActiveSupport::OrderedOptions.new
config.service.api_key = ENV['SERVICE_API_KEY']
config.service.shared_secret = ENV['SERVICE_SHARED_SECRET']
#14 楼
我将建议一种很好的方法来处理您的应用程序中的所有配置。有三个基本规则:更改配置而不是代码;
在条件上使用配置;
编写有意义的代码。
要获得更详细的概述,请点击此链接:以正确的方式配置Rails
评论
重复:stackoverflow.com/questions/592554/…稍微相关:添加新的配置变量时,请不要忘记重新启动服务器。