【问题标题】:Where is the best place to store globals in Rails app?在 Rails 应用程序中存储全局变量的最佳位置在哪里?
【发布时间】:2011-02-09 21:14:09
【问题描述】:

我想知道是否有关于在 Rails 应用程序中存储全局设置的最佳实践。我的意思是:我定义了一些可能会改变的全局变量,但不太可能,而且将它们存储在数据库中似乎不合适,因为它们被大量使用。例如,我有 SYSTEM_EMAIL 和 SYSTEM_EMAIL_SIGNATURE 和 SYSTEM_STORAGE_ROOT。

现在我将它们保存在 environment.rb 中,但我不确定这是否是存储它们的正确位置。

谢谢

编辑:

接受的答案仍然是合适的,但是我开始使用 https://github.com/markbates/configatron ,还有其他选项,但我最喜欢 configatron。

【问题讨论】:

    标签: ruby-on-rails ruby environment-variables


    【解决方案1】:

    environment.rb 是这个地方。您可以将其添加到模块并将其添加到 lib 目录。那么您可以将其称为 Module::MY_GLOBAL_VARIABLE。两者都有长处和短处。在 environment.rb 中还可以,但有时看起来很乱。如果所有这些全局变量都是相关的,您可以在一个模块中进行分组。

    【讨论】:

      【解决方案2】:

      Rails 3 引入了 Application 对象。即使使用 Rails 2,您也可能希望以类似的方式存储全局变量。

      【讨论】:

      • 有趣的是,我最近开始研究 Rails 3 - 特别是路线,但没有读过太多其他内容。我会看看。感谢您的指针马克
      【解决方案3】:

      因为这些值通常会根据您运行的环境而变化,所以我将全局变量存储在 config/environments/development.rb|production.rb|test.rb 中,并为每个环境设置适当的值。

      【讨论】:

      • 在 dev/prod/test 中应该相同的常量怎么样?与其将它们存储在所有三个环境中,是否有一个文件适用于所有三个环境?
      • 我自己的评论的答案似乎是/config/environment.rb。如果我错了,请有人纠正我。
      • 感谢您发布确认@Ben 我只是在寻找完全相同的东西。
      • 这似乎比标记为“答案”的答案要好得多。如果 Rails 已经为你做了,为什么还要为环境提供 case 语句?
      • 另请注意,如果您使用 environment.rb,您可能需要在 YourAppName::Application.initialize 之前定义常量!
      【解决方案4】:

      我将此类配置信息存储在 YML 文件中。有关详细信息,请参阅此screen-cast

      您也可以使用名为 app_config 的 gem。

      【讨论】:

        【解决方案5】:

        我最喜欢的技术之一是将包含常量的文件放在目录config/initializers/ 中(此目录中的所有文件都会自动加载),但每个不同的 Rails 环境都有一个部分。例如

        
        case ENV['RAILS_ENV']
          when "development"
            SYSTEM_EMAIL = ...
            SYSTEM_EMAIL_SIGNATURE = ...
          when "staging"
            SYSTEM_EMAIL = ...
            SYSTEM_EMAIL_SIGNATURE = ...
          when "production"  
            SYSTEM_EMAIL = ...
            SYSTEM_EMAIL_SIGNATURE = ...
        end
        

        如果您想将所有常量加载到一个大哈希中,则可以将它们加载为 YAML 文件。创建两个文件,一个称为config/initializers/email_constants.rb,另一个称为config/email_constants.yml。在后者中输入如下内容:

        
        development:
          :system_email: ...
          :system_email_signature: ...
        staging:
          :system_email: ...
           system_email_signature: ...
        
        ... etc ...
        

        然后在config/initializers/email_constants.rb 中输入:

        
        EMAIL_CONSTANTS = YAML.load_file("#{RAILS_ROOT}/config/email_constants.yml")[RAILS_ENV]
        

        这会加载整个 YAML 文件并将相应键的值(代表 RAILS_ENV)分配给 EMAIL_CONSTANTS

        这两种技术的优势在于局部性。您可以将所有相互关联的常量(即本例中的电子邮件常量)放在一个文件中。此外,您不必将相同的常量分布在三个不同的文件中(每个 Rails 环境一个),而是将它们全部放在一个文件中。

        【讨论】:

        • 谢谢肖恩。我最喜欢你接近 - 除了我认为我不需要分成 email_constants.yml - 我将把所有东西都保存在 contacnts.yml 中
        【解决方案6】:

        通常当我做这样的事情时,我有两种方法

        1 - 如果我的全局变量对所有 3 个环境(开发、测试、生产)都是通用的,那么我会将其存储在

        config/environments.rb 文件

        但是可以说我的价值观正在随着环境而变化

        例如:我的开发环境 SYSTEM_STORAGE_ROOT 是 '/development_root/' 而测试环境 SYSTEM_STORAGE_ROOT 是 '/testing_root/'

        然后我会把它们存放在里面

        配置/环境/

        按照上面的例子

        config/environments/development.rb 将有 SYSTEM_STORAGE_ROOT = '/development_root/'

        config/environments/test.rb 将有 SYSTEM_STORAGE_ROOT = '/testing_root/'

        config/environments/production.rb 将有 SYSTEM_STORAGE_ROOT = '/production_root/'

        希望这会有所帮助,

        干杯, 同龄人

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-09-11
          • 2012-03-13
          • 1970-01-01
          • 2010-11-09
          • 2013-02-10
          • 1970-01-01
          • 2021-10-18
          相关资源
          最近更新 更多