28 Feb 2006Flexible Application Configuration in Rails
Most of my rails application have required some form of application specific configuration. When the configuration varies depending on where I deploy it I prefer to externalize the configuration in a YAML file similar to the way database configuration is handled.
I remember reading a blog somewhere that suggested the use of OpenStruct and have since started using the following code placed at the bottom of my config/environment.rb
file.
require ‘ostruct’
require ‘yaml’
ConfigFile = “\#{RAILS\_ROOT}/config/config.yml”
if File.exist?(ConfigFile)
::ApplicationConfig = OpenStruct.new(YAML.load\_file(ConfigFile))
end
Consider the scenario where config/config.yml
contains;
proxy\_config:
host: proxy.cs.latrobe.edu.au
port: 8080
I could then access the the configuration data using
>> ApplicationConfig.proxy\_config\[‘host’\]
=> “proxy.cs.latrobe.edu.au”
>> ApplicationConfig.proxy\_config\[‘port’\]
=> 8080
To make your code more robust in the scenario where either the proxy configuration is missing or the whole configuration file is missing I generally add in extra guards. Below is an example of the code I use to instantiate a Net:HTTP object. If the configuration file is present and it contains a proxy_config section then the code will attempt to instantiate a Net::HTTP::Proxy object. Otherwise the code will instantiate a plain old Net::HTTP that will not attempt to go via a proxy server.
def http
if Module.constants.include?(“ApplicationConfig”) &&
ApplicationConfig.respond\_to?(:proxy\_config)
host = ApplicationConfig.proxy\_config\[‘host’\]
port = ApplicationConfig.proxy\_config\[‘port’\]
Net::HTTP::Proxy(host, port)
else
Net::HTTP
end
end