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

其次,我计划为我的应用程序中的上载提供S3支持,如果我想添加一个具有s3访问,密钥的yaml文件,如何在Rails App中初始化它,并如何访问在该配置文件中定义的值。

评论

重复:stackoverflow.com/questions/592554/…

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

#1 楼

Update 1

非常推荐:我现在使用Rails Config gem,以提供它提供的细粒度控制。

Update2

如果需要快速解决方案,然后检查下面的杰克·普拉特(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


评论


这个答案已经过时了。请参阅下面的stackoverflow.com/questions/1450285/…

–马特维恩
2011年5月27日15:35

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

–拉瑟·V·卡尔森(Lasse V. Karlsen)
2011年5月27日19:54

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

– jcollum
2011-12-15 23:16

对于任何想在Rails 3+中使用YAML方法的人,都必须用Rails.env替换RAILS_ENV,用Rails.root替换RAILS_ROOT。

–瑞安
2012年5月17日18:47

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

–NhímHổBáo
15年4月8日在19:58

#2 楼

在Rails 3中,可以将应用程序特定的自定义配置数据放置在应用程序配置对象中。可以在初始化文件或环境文件中分配配置-例如对于给定的应用程序MyApp

MyApp::Application.config.custom_config_variable = :my_config_setting




br />
要读取设置,只需调用配置变量而不对其进行设置:

Rails.configuration.custom_config_variable = :my_config_setting


UPDATE Rails 4

在Rails 4提供了一种新的方法=> http://guides.rubyonrails.org/configuring.html#custom-configuration



评论


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

– pduey
2011年4月26日在16:13

这是分配,但是您如何访问该值?

–kevzettler
2011年8月10日16:39

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

–詹姆斯
2011年8月31日14:58

简单的花花公子:路径:config / environments / production.rb配置:config.whatever = false可以在任何地方访问它:Rails.configuration.whatever

– Victor S
2012年1月1日23:26



请注意,如果仅在生产环境中设置某些内容,并尝试在其他环境中访问它,则会抱怨未定义的方法。

–卢拉拉拉
2012-03-15 10:44

#3 楼

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

config/environments/development.rb中,编写

config.custom_config_key = :config_value


然后可以从其他使用

Rails.application.config.custom_config_key

的文件

评论


请注意,如果仅在生产环境中设置某些内容,并尝试在其他环境中访问它,则会抱怨未定义的方法。

–卢拉拉拉
2012年3月15日上午10:45

我在Rails 4.1中对此进行了尝试,但出现错误,“ ... method_missing':# ...的未定义方法存储”。我试图添加“ config.store.works”配置变量。

– Spundun
2014年3月19日在21:52



@Spundun您会收到该错误,因为Rails不知道什么是商店。为了在此答案中使用该方法,您可以重命名变量store_works,或创建一个其中定义了作品的config.store块。

–Paul Pettengill
2014年8月21日在18:16



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

– Spundun
2014年8月21日在18:48

#4 楼

可以在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


评论


camelCase:o使用snake_case!

– siegy22
17年4月24日在19:41

#5 楼

在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.application.config_for :acme并使用正确的环境。

#6 楼

从Rails 4.2开始,没有其他gem,您只需使用Rails.application.config_for :hi即可加载config / hi.yml。例如,




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





现在您可以在应用程序中的任何地方使用AUTHENTICATION常量:

#rails c production
:001> AUTHENTICATION['username'] => 'aa'


然后将passwords.yml添加到.gitignore:echo /config/passwords.yml >> .gitignore,创建一个舒适的示例文件cp /config/passwords.yml /config/passwords.example.yml,然后只需在生产控制台中使用实际生产值编辑示例文件即可。


#7 楼

我只是想将其更新为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

#8 楼

看看这个整洁的宝石到底是做什么的:
https://github.com/mislav/choices

这样,您的敏感数据就不会在开源项目中公开

#9 楼

我为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审阅者拒绝了我的编辑,说它太小了)

–卢拉拉拉
13年3月6日在10:05



#10 楼

我真的很喜欢settingslogic的宝石。非常容易设置和使用。

https://github.com/binarylogic/settingslogic

评论


到目前为止爱这个。将您的设置对象放在app / models / settings.rb中,您也可以在开发人员模式下重新加载。赢得!

–马特·沙弗(Mat Schaffer)
2011年11月7日在16:41

#11 楼

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

#12 楼

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

评论


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

– Shiv
09年9月20日在16:09

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

–卢拉拉拉
13年3月6日在9:26

#13 楼

我们开始在工作中使用的是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 楼

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


更改配置而不是代码;
在条件上使用配置;
编写有意义的代码。

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