如何在rails中定义自定义配置变量

时间:2009-09-20 04:17:10

标签: ruby-on-rails configuration

我想知道如何将自定义配置变量添加到rails应用程序以及如何在控制器中访问它们,例如我希望能够在配置文件中定义upload_directory,例如development.rb并且能够访问它我的一个控制器。

其次我计划在我的应用程序中为上传提供S3支持,如果我想添加带有s3访问权限的yaml文件,密钥,如何在我的Rails应用程序中初始化它以及如何访问值我已在该配置文件中定义。

15 个答案:

答案 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

enter image description here

答案 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)

在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.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:

  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. and now you can use AUTHENTICATION constant everywhere in your application:

    #rails c production
    :001> AUTHENTICATION['username'] => 'aa'
    
  2. 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宝石。非常容易设置和使用。

https://github.com/binarylogic/settingslogic

答案 10 :(得分:4)

如果您使用Heroku或者需要将您的应用程序设置保留为环境变量,figaro gem非常有帮助。

答案 11 :(得分:2)

我喜欢使用rails-settings来获取需要通过网络界面更改的全局配置值。

答案 12 :(得分:1)

Rails 6

许多过时的答案,因此添加一个特定于 Rails 6 的答案。

应用程序特定的配置进入初始化文件。详情请见:edge guides

示例:

config/initializers/foo.rb

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 加载整个自定义配置文件:

config/payment.yml

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

然后加载它:

config/initializers/load_payment.rb

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