我想知道如何向Rails应用程序添加自定义配置变量,以及如何在控制器中访问它们,例如,我想能够在配置文件中定义一个upload_directory,例如development.rb,并能够在其中一个文件中访问它。控制器。
其次,如果要添加具有s3访问权限,秘密密钥的yaml文件,我打算如何在应用程序中支持S3,如何在Rails应用程序中对其进行初始化以及如何访问已定义的值在该配置文件中。
我想知道如何向Rails应用程序添加自定义配置变量,以及如何在控制器中访问它们,例如,我想能够在配置文件中定义一个upload_directory,例如development.rb,并能够在其中一个文件中访问它。控制器。
其次,如果要添加具有s3访问权限,秘密密钥的yaml文件,我打算如何在应用程序中支持S3,如何在Rails应用程序中对其进行初始化以及如何访问已定义的值在该配置文件中。
Answers:
更新1
强烈建议:我现在将使用Rails Config gem,因为它提供了细粒度的控件。
更新2
如果您想快速解决问题,请在下面查看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
RAILS_ENV
与Rails.env
和RAILS_ROOT
用Rails.root
。
在Rails 3中,可以将应用程序特定的定制配置数据放置在应用程序配置对象中。可以在初始化文件或环境文件中分配配置-例如对于给定的应用程序MyApp
:
MyApp::Application.config.custom_config_variable = :my_config_setting
要么
Rails.configuration.custom_config_variable = :my_config_setting
要读取设置,只需调用配置变量而不设置它:
Rails.configuration.custom_config_variable
=> :my_config_setting
更新Rails 4
在Rails 4中,有一种新的方法可用于此=> http://guides.rubyonrails.org/configuring.html#custom-configuration
config/environments/production.rb
配置: config.whatever = false
可以在任何地方访问: Rails.configuration.whatever
undefined method
。
在Rails 3.0.5中,以下方法对我有用:
在中config/environments/development.rb
,写
config.custom_config_key = :config_value
custom_config_key
然后可以使用其他文件引用该值
Rails.application.config.custom_config_key
undefined method
。
method_missing': undefined method
存储在#<Rails :: Application :: Configuration:0x007f9f735b7240> ...”。我试图添加“ config.store.works”配置变量。
store
。为了在此答案中使用该方法,您可以重命名变量store_works
,或创建一个config.store
在works
其中定义的块。
这在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
假设您将自定义变量放入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.configuration.acme.api_user
方便Rails.application.config_for :acme
您加载acme.yml
并使用正确的环境。
从Rails 4.2开始,没有其他gem,您只需使用即可加载config / hi.ymlRails.application.config_for :hi
。
例如:
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
,然后只需在生产控制台中使用实际生产值来编辑示例文件。
我只是想将其更新为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
看看这个整洁的宝石到底是做什么的:https : //github.com/mislav/choices
这样,您的敏感数据就不会在开源项目中公开
我为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。
我真的很喜欢settingslogic的宝石。非常容易设置和使用。
我喜欢将rails-settings用于需要通过Web界面更改的全局配置值。
我们开始在工作中做的是ActiveSupport Ordered Hash
这使您可以在环境文件中清晰地定义配置,例如
config.service = ActiveSupport::OrderedOptions.new
config.service.api_key = ENV['SERVICE_API_KEY']
config.service.shared_secret = ENV['SERVICE_SHARED_SECRET']