我想知道如何将自定义配置变量添加到rails应用程序以及如何在控制器中访问它们,例如我希望能够在配置文件中定义upload_directory,例如development.rb并且能够访问它我的一个控制器。
其次我计划在我的应用程序中为上传提供S3支持,如果我想添加带有s3访问权限的yaml文件,密钥,如何在我的Rails应用程序中初始化它以及如何访问值我已在该配置文件中定义。
答案 0 :(得分:371)
在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
UPDATE Rails 4
在Rails 4中,有一种新方法=> http://guides.rubyonrails.org/configuring.html#custom-configuration
答案 1 :(得分:163)
更新1
非常推荐:我现在正在使用Rails Config gem进行精细控制。
<强> UPDATE2 强>
如果您想要快速解决方案,请查看下面的Jack Pratt's answer。
虽然我的原始答案仍然有效,但这个答案现在已经过时了。我建议查看更新1和2。
原始答案:
要获得快速解决方案,请观看Ryan Bates的“YAML配置文件”screen cast应该会非常有帮助。
总结:
# 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
答案 2 :(得分:68)
在Rails 3.0.5中,以下方法对我有用:
在config/environments/development.rb
中,写一下
config.custom_config_key = :config_value
然后可以使用
从其他文件中引用值custom_config_key
Rails.application.config.custom_config_key
答案 3 :(得分:31)
这适用于rails 3.1:
config / environment.rb中的(或在config / environments / ..中定位特定环境):
YourApp::Application.config.yourKey = 'foo'
这可以在控制器或这样的视图中访问:
YourApp::Application.config.yourKey
(YourApp应替换为您的应用程序名称。)
注意:这是Ruby代码,所以如果你有很多配置键,你可以这样做:
在config / environment.rb中:YourApp::Application.configure do
config.something = foo
config.....
config....
.
config....
end
答案 4 :(得分:27)
假设您将自定义变量放入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
并使用正确的环境很方便。
答案 5 :(得分:19)
Since Rails 4.2, without additional gems, you can load config/hi.yml simply by using Rails.application.config_for :hi
.
For example:
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
and now you can use AUTHENTICATION
constant everywhere in your application:
#rails c production
:001> AUTHENTICATION['username'] => 'aa'
then add passwords.yml to .gitignore: echo /config/passwords.yml >> .gitignore
, create an example file for your comfort cp /config/passwords.yml /config/passwords.example.yml
and then just edit your example file in your production console with actual production values.
答案 6 :(得分:12)
我只是想为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
答案 7 :(得分:8)
看看这个整洁的宝石正是这样做的: https://github.com/mislav/choices
这样,您的敏感数据就不会在开源项目中公开
答案 8 :(得分:4)
我为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。
答案 9 :(得分:4)
我非常喜欢settingslogic宝石。非常容易设置和使用。
答案 10 :(得分:4)
如果您使用Heroku或者需要将您的应用程序设置保留为环境变量,figaro gem非常有帮助。
答案 11 :(得分:2)
我喜欢使用rails-settings来获取需要通过网络界面更改的全局配置值。
答案 12 :(得分:1)
Rails 6
许多过时的答案,因此添加一个特定于 Rails 6 的答案。
应用程序特定的配置进入初始化文件。详情请见:edge guides
示例:
module MyApp
class Application < Rails::Application
config.test_val = 'foo'
end
end
或者:
Rails.application.config.test_val = 'foo'
现在可以通过以下方式访问:
Rails.configuration.test_val
更多的可能性。 edge guides #custom-configuration
例如,您还可以设置嵌套命名空间配置:
config.x.payment_processing.schedule = :daily
config.x.payment_processing.retries = 3
config.super_debugger = true
或使用 config_for 加载整个自定义配置文件:
production:
environment: production
merchant_id: production_merchant_id
public_key: production_public_key
private_key: production_private_key
development:
environment: sandbox
merchant_id: development_merchant_id
public_key: development_public_key
private_key: development_private_key
然后加载它:
module MyApp
class Application < Rails::Application
config.payment = config_for(:payment)
end
end
答案 13 :(得分:0)
我们在工作中开始做的事情是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 :(得分:-4)
我建议如何处理应用程序中的配置。有三个基本规则:
要获得更详细的概述,请点击此链接:Rails configuration in the proper way