Where is the best place to store globals in Rails app? Where is the best place to store globals in Rails app? ruby ruby

Where is the best place to store globals in Rails app?


One of my favourite techniques is to put a file containing the constants in directory config/initializers/ (all files in this directory are loaded automatically) but with a section for each different Rails environment. 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

If you want, instead, to load up all the constants in one big hash then you can load them as a YAML file. Create two files, one called, say, config/initializers/email_constants.rb and the other config/email_constants.yml. In the latter put something like:

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

Then in config/initializers/email_constants.rb put:

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

This loads the entire YAML file and the assigns the value of the appropriate key (which represents the RAILS_ENV) to EMAIL_CONSTANTS.

The advantage of both of these techniques is locality. You can place all the constants that are related to each other (i.e. email constants in this case) in one file. Also, instead of having the same constants spread across three different files (one for each Rails environment) you have them all in one file.


Because such values often change depending on the environment you're running in, I store globals in config/environments/development.rb|production.rb|test.rb, with appropriate values for each environment.


Rails 3 introduces the Application object. Even with Rails 2, you might want to store your globals in a similar manner.