在Rails应用程序中存储全局变量的最佳位置在哪里?

时间:2010-04-19 21:08:04

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

我想知道是否有关于在rails应用程序中存储全局设置的最佳实践。我的意思是:我有一些可能会改变的全局变量,但不太可能,因为它们被如此多地使用而将它们存储在DB中似乎是不合适的。例如,我有SYSTEM_EMAIL& SYSTEM_EMAIL_SIGNATURE& SYSTEM_STORAGE_ROOT。

现在我将它们保存在environment.rb中,但我不确定这是否适合存储它们。

谢谢

修改

接受的答案仍然适用,但我继续使用https://github.com/markbates/configatron,还有其他选择,但我最喜欢configatron。

6 个答案:

答案 0 :(得分:15)

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


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 put:


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

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

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

答案 1 :(得分:10)

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

答案 2 :(得分:2)

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

答案 3 :(得分:1)

environment.rb就是这个地方。您可以将其添加到模块并将其添加到lib目录。然后你可以把它称为Module :: MY_GLOBAL_VARIABLE。两者都有优点和缺点。在environment.rb是好的,但有时它看起来很乱。如果所有这些全局变量都相关,则可以在模块中进行分组。

答案 4 :(得分:1)

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

或者,您可以使用名为app_config的宝石。

答案 5 :(得分:1)

通常当我做这样的事情时,我有两种方法可以做到这一点

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

config / environments.rb文件

但我要说我的价值观正在改变环境

Ex:我的开发环境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 /'

希望这有帮助,

欢呼声, sameera