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

kon*_*ung 12 ruby ruby-on-rails environment-variables

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

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

谢谢

编辑:

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

Sea*_*ied 15

我最喜欢的技术之一是将包含常量的文件放在目录中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
Run Code Online (Sandbox Code Playgroud)

相反,如果您希望在一个大哈希中加载所有常量,则可以将它们作为YAML文件加载.创建两个文件,一个叫,说,config/initializers/email_constants.rb和其他config/email_constants.yml.在后者中添加如下内容:


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

... etc ...
Run Code Online (Sandbox Code Playgroud)

然后config/initializers/email_constants.rb放入:


EMAIL_CONSTANTS = YAML.load_file("#{RAILS_ROOT}/config/email_constants.yml")[RAILS_ENV]
Run Code Online (Sandbox Code Playgroud)

这将加载整个YAML文件,并指定相应键(代表RAILS_ENV)的值EMAIL_CONSTANTS.

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


Ben*_*Ben 10

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