ChatGPT解决这个技术问题 Extra ChatGPT

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

我想知道如何将自定义配置变量添加到 Rails 应用程序以及如何在控制器中访问它们?

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

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

J
Joel AZEMAR

在 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

https://i.stack.imgur.com/ASdRg.png


这个对我有用。我将特定于环境的配置设置放在environments/{environment}.rb 中,例如,environments/development.rb。确保在修改后重新启动服务器。可能有更优雅的技术,但我正在升级以前在同一文件中使用 ENV['XXX'] 的现有应用程序,并且由于我想在升级期间限制重构量,因此效果很好。
这是赋值,但是你如何访问这个值呢?
如果您查看 rails 3.x 应用程序的 application.rb ,它会按照此答案显示“应用程序配置应进入 config/initializers 中的文件”。有大量关于如何访问变量 (edgeguides.rubyonrails.org/configuring.html) 的文档。例如,在初始化程序文件夹中名为 some_variables.rb 的文件中,如上所述放置变量(将 MyApp 替换为您的应用程序的名称),然后当您想使用它时,只需调用 config.custom_config_variable 您当然可以使用您喜欢的任何变量名称. @Jack Pratt您可以编辑更完整的答案吗?
伙计,简单:路径:config/environments/production.rb 配置:config.whatever = false 在任何地方访问它:Rails.configuration.whatever
请注意,如果您仅在生产中设置某些内容,并尝试在另一个环境中访问它,它会报错 undefined method
C
Community

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

这个答案已经过时了。请参阅下面的stackoverflow.com/questions/1450285/…
@matt:是因为 Rails 3 已经发布而过时了,还是因为现在每个人都在使用 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 行?
R
Rory O'Kane

在 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 #<Rails::Application::Configuration:0x007f9f735b7240>...”。我试图添加“config.store.works”配置变量。
@Spundun您收到该错误,因为Rails不知道 store 是什么。为了在此答案中使用该方法,您可以重命名变量 store_works,或创建一个 config.store 块,其中定义了 works
谢谢,我终于想通了。这些是嵌套哈希,所以如果我要在我的配置名称中使用点,我必须递归地初始化空哈希。
p
pymkin

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


A
Alain Beauvois

这适用于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!
E
Evgenia Karunus

从 Rails 4.2 开始,无需额外的 gem,您只需使用 Rails.application.config_for :hi 即可加载 config/hi.yml

例如:

touch config/passwords.yml #config/passwords.yml 开发:用户名:'a' 密码:'b' 生产:用户名:'aa' 密码:'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 然后只需在生产控制台中使用实际生产值编辑您的示例文件。


s
smathy

我只是想为 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


j
jpgeek

导轨 6

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

应用程序特定的配置进入初始化文件。详细信息在这里:edge guides

例子:

配置/初始化程序/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 加载整个自定义配置文件:

配置/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

然后加载它:

配置/初始化程序/load_payment.rb

module MyApp
  class Application < Rails::Application
    config.payment = config_for(:payment)
  end
end

F
Flov

看看这个整洁的宝石就是这样做的:https://github.com/mislav/choices

这样你的敏感数据就不会暴露在开源项目中


j
johnmcaliley

我为 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(所以审稿人拒绝了我的编辑,说它太小了)
R
Rahil Sondhi

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

https://github.com/binarylogic/settingslogic


到目前为止喜欢这个。将你的设置对象放在 app/models/settings.rb 也可以让你在开发模式下重新加载。赢!
M
MikeH

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


c
cite

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


我不想使用其他插件等,因为我正在学习 Rails,所以最好的方法是没有任何插件。
请注意,这使用数据库来存储配置,这对某些人来说可能太重了。
m
mdb29

我们在工作中开始做的是ActiveSupport Ordered Hash

它允许您在环境文件中干净地定义您的配置,例如

config.service = ActiveSupport::OrderedOptions.new
config.service.api_key = ENV['SERVICE_API_KEY']
config.service.shared_secret = ENV['SERVICE_SHARED_SECRET']

p
paladiy

我会建议如何处理应用程序中的配置的好方法。有三个基本规则:

更改您的配置而不是代码;

在条件下使用配置;

编写有意义的代码。

要获得更详细的概述,请点击此链接:Rails configuration in the proper way