如何在rails中定义自定义configurationvariables
我想知道如何将自定义configurationvariables添加到rails应用程序,以及如何在控制器中访问它们,例如我想能够在configuration文件中定义一个upload_directory,说development.rb,并能够在我的一个控制器。
其次我打算在我的应用程序中拥有S3上传支持,如果我想添加一个yaml文件和s3访问密钥,我如何在我的Rails应用程序中初始化它,以及如何访问我定义的值在那个configuration文件中。
更新1
非常推荐:我现在正在使用Rails Config Gem进行细粒度控制。
UPDATE2
如果你想要一个快速的解决scheme,然后检查下杰克普拉特的答案 。
虽然我原来的答案仍然有效,但现在这个答案已经过时了。 我build议看看更新1和2。
原始答案:
为了快速解决问题,观看Ryan Bates演示的“YAMLconfiguration文件” 屏幕会非常有帮助。
综上所述:
# 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 3中,应用程序特定的自定义configuration数据可以放在应用程序configuration对象中。 可以在初始化文件或环境文件中分配configuration – 对于给定的应用程序MyApp
:
MyApp::Application.config.custom_config_variable = :my_config_setting
要么
Rails.configuration.custom_config_variable = :my_config_setting
要读取设置,只需调用configurationvariables而不设置它:
Rails.configuration.custom_config_variable => :my_config_setting
更新Rails 4
在Rails 4中有一个新的方法=> http://guides.rubyonrails.org/configuring.html#custom-configuration
在Rails 3.0.5中,下面的方法适用于我:
在config/environments/development.rb
,编写
config.custom_config_key = :config_value
然后可以使用其他文件引用custom_config_key
的值
Rails.application.config.custom_config_key
这在rails 3.1中工作:
在config / environment.rb中(或者在config / environments / ..中以定位特定的环境):
YourApp::Application.config.yourKey = 'foo'
这将可以在控制器或这样的意见:
YourApp::Application.config.yourKey
(您的应用程序应该replace为您的应用程序名称。)
注意 :这是Ruby代码,所以如果你有很多configuration键,你可以这样做:
在config / environment.rb中:
YourApp::Application.configure do config.something = foo config..... config.... . config.... end
在Rails 4中
假设你把你的自定义variables放到yaml文件中:
# config/acme.yml development: :api_user: 'joe' :api_pass: 's4cret' :timeout: 20
创build一个初始化器来加载它们:
# 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中更新这个最新的酷东西,你现在可以在你的config/**/*.rb
文件中做这个:
config.x.whatever.you.want = 42
…这将在您的应用程序中可用:
Rails.configuration.x.whatever.you.want
在这里看到更多: http : //guides.rubyonrails.org/configuring.html#custom-configuration
由于Rails 4.2,没有额外的gem,您可以简单地通过使用Rails.application.config_for :hi
加载config / Rails.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
-
现在你可以在应用程序的任何地方使用
AUTHENICATION
常量:#rails c production :001> AUTHENTICATION['username'] => 'aa'
-
然后将passwords.yml添加到.gitignore :
echo /config/passwords.yml >> .gitignore
,为您的舒适创build一个示例文件cp /config/passwords.yml /config/passwords.example.yml
,然后编辑您的示例文件在具有实际生产值的生产控制台中。
看看这个完整的gem: https : //github.com/mislav/choices
这样你的敏感数据就不会在开源项目中暴露出来
我为YAML设置创build了一个简单的插件: Yettings
它的工作方式和khelll的答案中的代码类似,但是你只需要添加这个YAMLconfiguration文件:
app/config/yetting.yml
该插件dynamic创build一个类,允许您像应用程序中的类方法那样访问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的gem。 非常容易设置和使用。
如果您使用Heroku或其他方式需要保持您的应用程序设置为环境variables, figarogem是非常有用的。
我喜欢使用rails-settings来设置需要通过web界面进行更改的全局configuration值。
我会build议如何在你的应用程序中处理configuration的好方法。 有三条基本规则:
- 改变你的configuration不是一个代码;
- 根据条件使用configuration;
- 写代码意味着什么。
要更详细地了解这个链接,请按照以下步骤进行操作