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


337

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

其次,如果要添加具有s3访问权限,秘密密钥的yaml文件,我打算如何在应用程序中支持S3,如何在Rails应用程序中对其进行初始化以及如何访问已定义的值在该配置文件中。



稍微相关:添加新的配置变量时,请不要忘记重新启动服务器。
DamienÓCeallaigh 2015年

Answers:


165

更新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

62
这个答案已经过时了。见stackoverflow.com/questions/1450285/...下面
mattwynne

8
@matt:是因为过时的Rails 3发行了,还是因为每个人现在都在Rails 3中发行了?
Lasse V. Karlsen

感谢您指出过时的内容。我讨厌Rails-1年前的代码太旧了。
jcollum

2
对于任何想使用Rails的3+ YAML方法,你就必须更换RAILS_ENVRails.envRAILS_ROOTRails.root
瑞安

我尝试了rails_config。他们在文档中指示我在我的app.rb中注册RailsConfig。我假设app.rb = config / application.rb。但是,应在application.rb中的哪个位置放置RailsConfig行?
Nhím何宝

375

在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

在此处输入图片说明


11
这个对我有用。我将特定于环境的配置设置放在环境/{environment}.rb中,例如,环境/development.rb。确保修改后重新启动服务器。可能会有更优雅的技术,但是我正在升级以前在同一文件中使用过ENV ['XXX']的现有应用程序,并且由于我想限制升级期间的重构量,因此效果很好。
pduey 2011年

13
这是分配,但是您如何访问该值?
kevzettler 2011年

9
如果您在Rails 3.x应用程序的application.rb中查找,则根据此答案说“应用程序配置应放入config / initializers中的文件中”。关于如何访问变量,有很多文档(edgeguides.rubyonrails.org/configuring.html)。例如,在初始化程序文件夹中的一个名为some_variables.rb的文件中,按照上面所述放置变量(将MyApp替换为您的应用名称),然后在您要使用它时,只需调用config.custom_config_variable您当然可以使用您喜欢的任何变量名。@Jack Pratt您可以编辑一个更完整的答案吗?
jamesc 2011年

48
杜德(Dude),简单:路径: config/environments/production.rb 配置: config.whatever = false 可以在任何地方访问: Rails.configuration.whatever
Victor

5
请注意,如果仅在生产环境中设置某些内容,并尝试在其他环境中访问它,则会抱怨undefined method
lulalala 2012年

69

在Rails 3.0.5中,以下方法对我有用:

在中config/environments/development.rb,写

config.custom_config_key = :config_value

custom_config_key然后可以使用其他文件引用该值

Rails.application.config.custom_config_key

4
请注意,如果仅在生产环境中设置某些内容,并尝试在其他环境中访问它,则会抱怨undefined method
lulalala 2012年

我在rails 4.1中对此进行了尝试,但出现错误,“ ......” method_missing': undefined method 存储在#<Rails :: Application :: Configuration:0x007f9f735b7240> ...”。我试图添加“ config.store.works”配置变量。
Spundun

1
@Spundun您正在得到该错误,因为Rails不知道是什么store。为了在此答案中使用该方法,您可以重命名变量store_works,或创建一个config.storeworks其中定义的块。
Paul Pettengill 2014年

谢谢,我终于明白了。这些是嵌套哈希,因此如果要在配置名称中使用点,则必须递归初始化空哈希。
Spundun

31

这在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

2
camelCase:o使用snake_case!
siegy22

30

在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并使用正确的环境。


21

从Rails 4.2开始,没有其他gem,您只需使用即可加载config / hi.ymlRails.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. 现在您可以AUTHENTICATION在应用程序中的任何地方使用常量:

    #rails c production
    :001> AUTHENTICATION['username'] => 'aa'
  2. 然后将passwords.yml添加到.gitignore:中echo /config/passwords.yml >> .gitignore,创建一个示例文件以使您感到舒适cp /config/passwords.yml /config/passwords.example.yml,然后只需在生产控制台中使用实际生产值来编辑示例文件。




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。


官方回购现在位于:github.com/charlotte-ruby/yettings(SO审阅者拒绝我的编辑说它太小了)
lulalala 2013年


4

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


2

我喜欢将rails-settings用于需要通过Web界面更改的全局配置值。


2
我要使用其他插件等,因为我正在学习Rails,所以最好的方法是没有任何插件。
Shiv

请注意,这使用数据库来存储配置,这对于某些人来说可能太重了。
lulalala

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']

-5

我将建议一种很好的方法来处理您的应用程序中的所有配置。有三个基本规则:

  • 更改您的配置而不是代码;
  • 根据条件使用配置;
  • 编写有意义的代码。

要获得更详细的概述,请单击此链接:正确配置Rails

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.