如何在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

例如:

  1. touch config/passwords.yml

      #config/passwords.yml development: username: 'a' password: 'b' production: username: 'aa' password: 'bb' 
  1. touch config/initializers/constants.rb

     #config/initializers/constants.rb AUTHENTICATION = Rails.application.config_for :passwords 
  1. 现在你可以在应用程序的任何地方使用AUTHENICATION常量:

     #rails c production :001> AUTHENTICATION['username'] => 'aa' 
  2. 然后将passwords.yml添加到.gitignoreecho /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。 非常容易设置和使用。

https://github.com/binarylogic/settingslogic

如果您使用Heroku或其他方式需要保持您的应用程序设置为环境variables, figarogem是非常有用的。

我喜欢使用rails-settings来设置需要通过web界面进行更改的全局configuration值。

我会build议如何在你的应用程序中处理configuration的好方法。 有三条基本规则:

  • 改变你的configuration不是一个代码;
  • 根据条件使用configuration;
  • 写代码意味着什么。

要更详细地了解这个链接,请按照以下步骤进行操作