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

Shi*_*hiv 332 configuration ruby-on-rails

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

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

小智 372

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

MyApp::Application.config.custom_config_variable = :my_config_setting
Run Code Online (Sandbox Code Playgroud)

要么

Rails.configuration.custom_config_variable = :my_config_setting
Run Code Online (Sandbox Code Playgroud)

要读取设置,只需调用配置变量而不进行设置:

Rails.configuration.custom_config_variable
=> :my_config_setting
Run Code Online (Sandbox Code Playgroud)

更新Rails 4

在Rails 4中有一种新方法=> http://guides.rubyonrails.org/configuring.html#custom-configuration

在此输入图像描述

  • 老兄,简单:路径:`config/environments/production.rb`配置:`config.whatever = false`随处访问:`Rails.configuration.whatever` (48认同)
  • 这是赋值,但是如何访问这个值呢? (13认同)
  • 这个对我有用.我将环境特定的配置设置放在environment/{environment} .rb中,例如,environment/development.rb.确保在修改后重新启动服务器.可能有更优雅的技术,但我正在升级以前在同一文件中使用ENV ['XXX']的现有应用程序,并且因为我想在升级期间限制重构量,所以这很好. (11认同)
  • 如果您查看rails 3.x应用程序的application.rb,那么根据此答案,"应用程序配置应该进入config/initializers中的文件".有很多关于如何访问变量的文档(http://edgeguides.rubyonrails.org/configuring.html).例如,在initializers文件夹中名为some_variables.rb的文件中放置如上所述的变量(用您的应用程序名称替换MyApp)然后当您想要使用它时只需调用config.custom_config_variable您当然可以使用您喜欢的任何变量名称.@Jack Pratt你可以编辑一个更完整的答案吗? (9认同)
  • 请注意,如果您只在生产中设置某些内容,并尝试在其他环境中访问它,则会抱怨"未定义的方法". (5认同)
  • @Spundun我有同样的问题,这将做的伎俩:http://stackoverflow.com/a/18768914/498238 (3认同)
  • 请注意,`x`部分可能用于命名空间,并且在输入自定义配置时必须*包括在内。它是[`Rails :: Application :: Configuration :: Custom`]类型的对象(https://github.com/rails/rails/blob/v4.2.1/railties/lib/rails/application/configuration.rb# L191)。 (2认同)

khe*_*lll 163

更新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
Run Code Online (Sandbox Code Playgroud)

  • 这个答案已经过时了.请参阅下面的http://stackoverflow.com/questions/1450285/how-to-define-custom-configuration-variables-in-rails/5053882#5053882 (62认同)
  • @matt:它已经过时了,因为Rails 3已经发布,或者因为*每个人*现在都在Rails 3上,或者......? (8认同)
  • 对于任何想要在Rails 3+中使用YAML方法的人,你必须用`Rails.rov`替换`RAILS_ENV`和用'Rails.root`替换`RAILS_ROOT`. (2认同)
  • 修改后的截屏视频:http://railscasts.com/episodes/85-yaml-configuration-revised (2认同)

Rob*_*son 68

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

config/environments/development.rb,写

config.custom_config_key = :config_value
Run Code Online (Sandbox Code Playgroud)

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

Rails.application.config.custom_config_key
Run Code Online (Sandbox Code Playgroud)

  • 请注意,如果您只在生产中设置某些内容,并尝试在其他环境中访问它,则会抱怨"未定义的方法". (4认同)

Ala*_*ois 31

这适用于rails 3.1:

在config/environment.rb中(或在config/environments/..中定位特定环境):

YourApp::Application.config.yourKey = 'foo'
Run Code Online (Sandbox Code Playgroud)

这将在控制器或视图中访问,如下所示:

YourApp::Application.config.yourKey
Run Code Online (Sandbox Code Playgroud)

(YourApp应替换为您的应用程序名称.)

注意:这是Ruby代码,所以如果你有很多配置键,你可以这样做:

在config/environment.rb中:

YourApp::Application.configure do
  config.something = foo
  config.....
  config....
  .
  config....
end
Run Code Online (Sandbox Code Playgroud)

  • camelCase:o使用snake_case! (2认同)

pym*_*kin 28

在Rails 4中

假设您将自定义变量放入yaml文件中:

# config/acme.yml
development:
  :api_user: 'joe'
  :api_pass: 's4cret'
  :timeout: 20
Run Code Online (Sandbox Code Playgroud)

创建一个初始化器来加载它们:

# 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
Run Code Online (Sandbox Code Playgroud)

现在,您可以在应用中的任何位置访问这些值,如下所示:

Rails.configuration.acme.api_user
Run Code Online (Sandbox Code Playgroud)

Rails.application.config_for :acme加载acme.yml和使用正确的环境很方便.


lak*_*are 20

从Rails 4.2开始,没有额外的宝石,只需使用即可加载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'
    
    Run Code Online (Sandbox Code Playgroud)
  1. touch config/initializers/constants.rb

    #config/initializers/constants.rb
    AUTHENTICATION = Rails.application.config_for :passwords
    
    Run Code Online (Sandbox Code Playgroud)
  1. 现在你可以AUTHENTICATION在应用程序的任何地方使用常量:

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


jpg*_*eek 20

轨道 6 和 7

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

应用程序特定的配置位于初始化程序文件中。详细信息在这里:边缘指南

例子:

配置/初始化器/foo.rb

module MyApp
  class Application < Rails::Application
    config.test_val = 'foo'
  end
end
Run Code Online (Sandbox Code Playgroud)

或者:

Rails.application.config.test_val = 'foo'
Run Code Online (Sandbox Code Playgroud)

现在可以通过以下方式访问:

Rails.configuration.test_val
Run Code Online (Sandbox Code Playgroud)

还有更多的可能性。 边缘指南#custom-configuration

例如,您还可以设置嵌套命名空间配置:

config.x.payment_processing.schedule = :daily
config.x.payment_processing.retries  = 3
config.super_debugger = true
Run Code Online (Sandbox Code Playgroud)

或使用 config_for 加载整个自定义配置文件:

配置/付款.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
Run Code Online (Sandbox Code Playgroud)

然后加载它:

配置/初始化程序/load_ payment.rb

module MyApp
  class Application < Rails::Application
    config.payment = config_for(:payment)
  end
end
Run Code Online (Sandbox Code Playgroud)


sma*_*thy 13

我只是想在Rails 4.2中更新这个最新的东西,你现在可以在任何config/**/*.rb文件中执行此操作:

config.x.whatever.you.want = 42
Run Code Online (Sandbox Code Playgroud)

...这将在您的应用中提供:

Rails.configuration.x.whatever.you.want
Run Code Online (Sandbox Code Playgroud)

在此处查看更多信息:http://guides.rubyonrails.org/configuring.html#custom-configuration


Flo*_*lov 8

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

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