如何在 Rails 中定义自定义配置变量
Posted
技术标签:
【中文标题】如何在 Rails 中定义自定义配置变量【英文标题】:How to define custom configuration variables in rails 【发布时间】:2010-11-29 20:01:01 【问题描述】:我想知道如何将自定义配置变量添加到 rails 应用程序以及如何在控制器中访问它们,例如我希望能够在配置文件中定义一个 upload_directory 说 development.rb 并能够访问它在我的一个控制器中。
其次,我计划在我的应用程序中让 S3 支持上传,如果我想添加一个带有 s3 访问权限、密钥的 yaml 文件,我如何在我的 Rails 应用程序中初始化它以及如何访问我已经在那个配置文件中定义了。
【问题讨论】:
复制:***.com/questions/592554/… 略相关:添加新配置变量时别忘了重启服务器。 【参考方案1】:在 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
【讨论】:
它对我有用。我将特定于环境的配置设置放在environments/environment.rb 中,例如environments/development.rb。确保在修改后重新启动服务器。可能有更优雅的技术,但我正在升级以前在同一文件中使用 ENV['XXX'] 的现有应用程序,并且由于我想在升级期间限制重构量,因此效果很好。跨度> 这是赋值,但是你如何访问这个值呢? 如果您查看 rails 3.x 应用程序的 application.rb ,它会按照此答案显示“应用程序配置应进入 config/initializers 中的文件”。有很多关于如何访问变量的文档 (edgeguides.rubyonrails.org/configuring.html)。例如在 initializers 文件夹中名为 some_variables.rb 的文件中放置如上所述的变量(将 MyApp 替换为您的应用程序的名称),然后当您想使用它时,只需调用 config.custom_config_variable 您当然可以使用您喜欢的任何变量名称。 @Jack Pratt,您可以编辑更完整的答案吗? 老兄,简单:路径:config/environments/production.rb
配置:config.whatever = false
随处访问:Rails.configuration.whatever
请注意,如果您只在生产环境中设置某些内容,并尝试在另一个环境中访问它,它会报错undefined method
。【参考方案2】:
更新 1
非常推荐:我现在使用Rails Config gem 来获得它提供的细粒度控制。
更新2
如果您想要快速解决方案,请查看下方的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
【讨论】:
这个答案已经过时了。请参阅下面的***.com/questions/1450285/… @matt:是因为 Rails 3 已经发布而过时了,还是因为 everyone 现在都在 Rails 3 上,还是...? 感谢您指出过时的。我讨厌 Rails 的这一点——一年前的代码太旧了。 对于任何想要在 Rails 3+ 中使用 YAML 方法的人,您必须将RAILS_ENV
替换为 Rails.env
并将 RAILS_ROOT
替换为 Rails.root
。
我试过 rails_config。在文档中,他们指示我在 app.rb 中注册 RailsConfig。我假设 app.rb = config/application.rb。但是我应该在 application.rb 的哪个位置放置注册 RailsConfig 行?【参考方案3】:
在 Rails 3.0.5 中,以下方法对我有用:
在config/environments/development.rb
,写
config.custom_config_key = :config_value
值 custom_config_key
然后可以从其他文件中引用
Rails.application.config.custom_config_key
【讨论】:
请注意,如果您仅在生产环境中设置某些内容,并尝试在其他环境中访问它,它会报错undefined method
。
我在 rails 4.1 中试过这个,但我收到错误,“...method_missing': undefined method
store' for #<:application::configuration:0x007f9f735b7240>...”。我试图添加“config.store.works”配置变量。
@Spundun 你得到了那个错误,因为 Rails 不知道 store
是什么。为了在这个答案中使用该方法,您可以重命名变量store_works
,或者创建一个config.store
块,其中定义了works
。
谢谢,我终于明白了。这些是嵌套哈希,所以如果我要在我的配置名称中使用点,我必须递归地初始化空哈希。【参考方案4】:
这适用于 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
【讨论】:
camelCase :o 使用snake_case!【参考方案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.configuration.acme.api_user
方便Rails.application.config_for :acme
会加载你的acme.yml
并使用正确的环境。
【讨论】:
【参考方案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】: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
【讨论】:
【参考方案10】:我为 YAML 设置创建了一个简单的插件:Yettings
它的工作方式与 khell's answer 中的代码类似,但您只需要添加此 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(所以审稿人拒绝了我的编辑,说它太小了)【参考方案11】:我真的很喜欢 settingslogic 宝石。非常容易设置和使用。
https://github.com/binarylogic/settingslogic
【讨论】:
到目前为止很喜欢这个。将你的设置对象放在 app/models/settings.rb 也可以让你在开发模式下重新加载。赢了!【参考方案12】:如果您使用 Heroku 或需要将应用程序设置保留为环境变量,figaro gem 非常有用。
【讨论】:
【参考方案13】:我喜欢将rails-settings 用于需要通过网络界面更改的全局配置值。
【讨论】:
我不想使用其他插件等,因为我正在学习 Rails,所以最好的方法是不使用任何插件。 请注意,这使用数据库来存储配置,这对某些人来说可能太重了。【参考方案14】:我们在工作中开始做的是ActiveSupport Ordered Hash
这允许您在环境文件中干净地定义您的配置,例如
config.service = ActiveSupport::OrderedOptions.new
config.service.api_key = ENV['SERVICE_API_KEY']
config.service.shared_secret = ENV['SERVICE_SHARED_SECRET']
【讨论】:
【参考方案15】:我会建议如何处理应用程序中的配置的好方法。有三个基本规则:
更改配置而不是代码; 根据条件使用配置; 编写有意义的代码。要获得更详细的概述,请点击此链接:Rails configuration in the proper way
【讨论】:
以上是关于如何在 Rails 中定义自定义配置变量的主要内容,如果未能解决你的问题,请参考以下文章