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

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

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

184256 次浏览

更新1

非常推荐:我现在使用Rails配置 gem,因为它提供了细粒度的控制。

更新2

如果你想要一个快速的解决方案,那么检查下面的杰克·普拉特的回答

虽然我下面最初的答案仍然有效,但这个答案现在已经过时了。我建议查看更新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

我喜欢使用rails-settings全局配置值,需要通过web界面更改。

在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

UPDATE Rails 4

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

enter image description here

在Rails 3.0.5中,以下方法对我来说是有效的:

config/environments/development.rb中,写入

config.custom_config_key = :config_value

custom_config_key可以从其他文件中引用

Rails.application.config.custom_config_key

我创建了一个简单的YAML设置插件:Yettings

它的工作方式与khell回答中的代码类似,但你只需要添加这个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。

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

https://github.com/binarylogic/settingslogic

检查这个整洁的宝石做的正是: https://github.com/mislav/choices < / p >

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

这适用于rails 3.1:

在config /环境。Rb(或在config/environments/..以特定环境为目标):

YourApp::Application.config.yourKey = 'foo'

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

YourApp::Application.config.yourKey

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

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

在config /环境。rb:

YourApp::Application.configure do
config.something = foo
config.....
config....
.
config....
end

如果你使用Heroku或者以其他方式需要将应用程序设置作为环境变量,费加罗 gem非常有用。

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

  • 改变你的配置而不是代码;
  • 在条件下使用配置;
  • 编写有意义的代码。

要获得更详细的概述,请访问这个链接:以正确的方式配置Rails

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

你可以通过使用Rails.application.config_for :hi来加载配置/ hi.yml

例如:

  1. < p > 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. and now you can use AUTHENTICATION constant everywhere in your application:

    #rails c production
    :001> AUTHENTICATION['username'] => 'aa'
    
  2. then add passwords.yml to .gitignore: echo /config/passwords.yml >> .gitignore, create an example file for your comfort cp /config/passwords.yml /config/passwords.example.yml and then just edit your example file in your production console with actual production values.

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

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

它允许你在环境文件中清晰地定义你的配置。

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

Rails 6

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

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

例子:

配置/初始化/ foo.rb

module MyApp
class Application < Rails::Application
config.test_val = 'foo'
end
end

另外:

Rails.application.config.test_val = 'foo'

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

Rails.configuration.test_val
更多的可能性。 边缘指南#自定义配置 < / p >

例如,你也可以设置嵌套的命名空间配置:

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