提问



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


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

最佳参考


更新1


非常推荐:我现在正在使用Rails Config gem进行细粒度控制。[35]


UPDATE2


如果你想快速解决问题,请查看Jack Pratt的答案。


虽然我的原始答案仍然有效,但这个答案现在已经过时了。我建议查看更新1和2。


原始答案:


要快速解决方案,观看由Ryan Bates演绎的YAML配置文件屏幕应该会非常有帮助。[37]


综上所述:


# 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

其它参考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


UPDATE Rails 4


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




其它参考2


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


config/environments/development.rb中,写一下


config.custom_config_key = :config_value


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


Rails.application.config.custom_config_key

其它参考3


这适用于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

其它参考4


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

其它参考5


从Rails 4.2开始,没有额外的宝石,只需使用Rails.application.config_for :hi即可加载 config/hi.yml 。


例如:



  1. 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. 现在您可以在应用程序的任何位置使用AUTHENTICATION常量:


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

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


其它参考6


我只是想在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 [39]

其它参考7


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


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

其它参考8


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


它的工作方式与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。

其它参考9


我非常喜欢settingslogic gem。非常容易设置和使用。 [42]


https://github.com/binarylogic/settingslogic[43]

其它参考10


如果您使用Heroku或者需要将您的应用程序设置保留为环境变量,那么figaro gem非常有用。[44]

其它参考11


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

其它参考12


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


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


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

其它参考13


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



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

  • 在条件下使用配置;

  • 编写具有某种意义的代码。



要获得更详细的概述,请访问以下链接:正确配置Rails [47]