Best way to set up application settings?

Hey Ben-

  Here is a model I use for settings and stuff like you are talking about. I wanted to be able to edit my configs in the interface so I store it in a model but it has an interface like a hash:

class DbHash < ActiveRecord::Base
   class << self
     def [](key)
       pair = find_by_key(key.to_s)
       pair.value unless pair.nil?
     end

     def []=(key, value)
       pair = find_by_key(key)
       unless pair
         pair = new
         pair.key, pair.value = key.to_s, value
         pair.save
       else
         pair.value = value
         pair.save
       end
       value
     end

     def to_hash
       Hash[ *find_all.map { |pair| [pair.key, pair.value] }.flatten ]
     end
   end
end

     create_table "configurations", :force => true do |t|
       t.column "key", :string, :limit => 40, :default => "", :null => false
       t.column "value", :string, :default => ""
     end

Cheers-
-Ezra

An alternative approach that we’ve tried in a couple of our apps is to extend Rails::Configuration to add our own settings. The nice thing about this approach is it lets us easily have different settings for different environments, with defaults and everything, just like the built in rails configuration options, and all checked in to svn. The downside is that we haven’t been able to figure out a way to do it without creating a global reference to the config object, which creates some awkward coupling between the config and whatever uses it, such as model objects. Its pretty easy to do, though.

in environment.rb:

class MyConfig < Rails::Configuration
#define attributes or whatever
end

MY_CONFIG = MyConfig.new
Rails::Initializer(:process, MY_CONFIG) do |config|
#all the usual config stuff

config.my_custom_setting = “default value”
end

Then wherever you need the configuration value, you can check it:

def some_method
filename = MY_CONFIG.my_custom_setting
end

We also tried a more dependency injection based approach, where the config object would set values for the classes that needed them. We ran into problems when classes are reloaded in development mode, though - everything would work fine on the first request, but on subsequent requests the class would have been reloaded, losing the values that had been set before, but the environment code does not get re-run so we would end up not having the values set at all.

Just an idea, and Ezra’s approach will certainly work great for storing the values in the database.

-Steve Holder

http://wiki.rubyonrails.org/rails/pages/SettingsPlugin

Very easy to use. Can be used to setup user specific settings, as
well as applicatoin-wide settings. Since the settings are in the db
you can change setting without restarting the app, as you would have
to if they were in environment.rb.