首页 文章

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

提问于
浏览
327

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

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

14 回答

  • 4

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

    https://github.com/binarylogic/settingslogic

  • -4

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

  • 159

    Update 1

    非常推荐:我现在用Rails Config gem进行它提供的细粒度控制 .

    Update2

    如果您想要快速解决方案,请查看下面的Jack Pratt's answer .

    Although my original answer below still works, this answer is now outdated. I recommend looking at updates 1 and 2.

    原答案:

    对于快速解决方案,观看Ryan Bates的"YAML Configuration File" 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
    
  • 4

    在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

  • 12

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

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

    config.custom_config_key = :config_value
    

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

    Rails.application.config.custom_config_key
    
  • 25

    这适用于rails 3.1:

    in config/environment.rb (or in config/environments/.. to target a specific environment) :

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

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

    YourApp::Application.config.yourKey
    

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

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

    在config / environment.rb中:

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

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

  • 31

    Since Rails 4.2, without additional gems, 您只需使用 Rails.application.config_for :hi 即可加载config / hi.yml .

    For example:

    • 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 ,然后在 生产环境 控制台中使用实际 生产环境 值编辑示例文件 .
  • 16

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

  • 0

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

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

  • 4

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

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

  • 369

    我喜欢使用rails-settings来获取需要通过Web界面更改的全局配置值 .

  • 68

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

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

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

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

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

    • 在条件下使用配置;

    • 写代码意味着什么 .

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

相关问题