ActiveConfiguration
ActiveConfiguration is an engine that exposes a generic settings store to ActiveRecord models. Made for very configurable applications, it allows you to avoid implementing specific ways to store settings for each model that needs such a configuration. If your application isn't very configurable, ActiveConfiguration isn't what you want.
If you had a Category
model that only had a configurable sort
attribute,
ActiveConfiguration would be overkill. Rather, you would just read and write
values using a specific sort
column and restrict the allowed values using
something like validates_inclusion_of
.
However, if your Category
model was more flexible in its configuration, you
may want a sort
setting, a limit
setting and multiple price_filter
settings that can be configured by your end user. Without ActiveConfiguration,
you would have to develop a way to store and validate these settings for this
specific scenario. The sort
and limit
settings are simple but because
price_filter
can accept multiple rules, you'd have to set up an additional
model. Still, this isn't really an issue when you're dealing with just a single
configurable model. When you're dealing with many, things tend to get messy.
With ActiveConfiguration, all of your settings, even for price_filter
, can
be stored in a generic way. ActiveConfiguration provides a place to store
settings for each of your models and even handles validation when you restrict
the allowed values or format of an option.
Source
The source for this engine is located at:
http://github.com/tsmango/active_configuration
Installation
Add the following to your Gemfile:
gem 'active_configuration'
Generate the migration for the settings
table:
rails g active_configuration:install
Note: The table can be changed from settings
to something else by specifying
a config option in an initializer like:
# config/initializers/active_configuration.rb
Rails.configuration.active_configuration_table_name = 'active_configuration_settings'
Migrate your database:
rake db:migrate
Example Configuration
class Category < ActiveRecord::Base
configure do
option :sort do
default 'alphabetical'
restrict 'alphabetical', 'manual'
end
option :limit do
format 'fixnum'
end
option :price_filter do
format 'float'
modifiers 'eq', 'lt', 'gt', 'lte', 'gte'
multiple true
end
end
end
After installing ActiveConfiguration, the #configure block is available to every ActiveRecord model. If the #configure block is defined with a valid configuration, additional methods are made available on the model.
Example Usage
Given we have defined the Category
class above, instances will now have a #settings
method where settings can be read from and written to.
>> category = Category.create(:name => 'Vinyl Records')
=> #<Category id: 1, name: "Vinyl Records", created_at: "2011-08-03 15:46:11", updated_at: "2011-08-03 15:46:11">
?> category.settings
=> #<ActiveConfiguration::SettingManager:0x10e7d1950 @configurable=#<Category id: 1, name: "Vinyl Records", created_at: "2011-08-03 15:46:11", updated_at: "2011-08-03 15:46:11">>
?> category.settings[:sort]
=> {:value=>"alphabetical", :modifier=>nil}
?> category.settings[:sort][:value]
=> "alphabetical"
?> category.settings[:sort][:value] = 'manual'
=> "manual"
?> category.settings[:price_filter]
=> []
?> category.settings[:price_filter] = [{:modifier => 'gt', :value => 10.00}, {:modifier => 'lte', :value => 25.00}]
=> [{:value=>10.0, :modifier=>"gt"}, {:value=>25.0, :modifier=>"lte"}]
?> category.save
=> true
?> category.settings[:sort][:value]
=> "manual"
?> category.settings[:price_filter]
=> [{:value=>10.0, :modifier=>"gt"}, {:value=>25.0, :modifier=>"lte"}]
Note:
Settings are only committed after a save
of the configurable model. If any
validation errors should arise, the save
on the model will return false and
errors will be added to the model's errors collection.
Testing Environment
The spec/ directory contains a skeleton Rails 3.0.0 application for testing purposes. All specs can be found in spec/spec/.
To run the specs, do the following from the root of active_configuration:
bundle install --path=vendor/bundles --binstubs
bin/rspec spec
License
Copyright © 2011 Thomas Mango, released under the MIT license.