我想知道是否有关于在rails应用程序中存储全局设置的最佳实践。我的意思是:我有一些可能会改变的全局变量,但不太可能,因为它们被如此多地使用而将它们存储在DB中似乎是不合适的。例如,我有SYSTEM_EMAIL& SYSTEM_EMAIL_SIGNATURE& SYSTEM_STORAGE_ROOT。
现在我将它们保存在environment.rb中,但我不确定这是否适合存储它们。
谢谢
修改
接受的答案仍然适用,但我继续使用https://github.com/markbates/configatron,还有其他选择,但我最喜欢configatron。
答案 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