Tunable
Pluggable settings for your AR models.
The code
Let's set up notification settings for our Users.
class User < ActiveRecord::Base
include Tunable::Model
has_settings :notify => :activity, :new_messages, :weekly_report
end
Now we can do:
user = User.create(:name => 'John Lennon')
user.get_setting(:notify, :activity) # => nil
user.settings = { notify: { activity: true } }
user.save
user.get_setting(:notify, :activity) # => true
Tunable also lets you set defaults for your settings. Here's how.
class User < ActiveRecord::Base
include Tunable::Model
has_settings :notify => {
activity: { default: false },
new_messages: { default: true },
weekly_report: { default: true }
}
end
Now we can do:
user = User.create(:name => 'John Lennon')
user.get_setting(:notify, :new_messages) # => true (default value)
user.settings = { notify: { new_messages: false } }
user.save
user.get_setting(:notify, :new_messages) # => false
Tunable also provides a main_settings helper that sets up main level settings.
class User < ActiveRecord::Base
include Tunable::Model
# in this case we're not setting a default value for the :no_cookies setting
main_settings :no_cookies, :language => { :default => 'en' }
end
Now let's see what happens.
user = User.create(:name => 'Paul MacCartney')
user.no_cookies # => nil
user.language # => 'en'
user.language = 'es'
user.no_cookies = true
user.save
user.no_cookies # => true
user.language # => 'es'
You can also set a lambda to return the default setting for a model.
class User < ActiveRecord::Base
main_settings :layout_color => {
:default => lambda { |user| user.is_admin? ? 'black' : 'blue' }
}
end
Then:
user = User.create(:name => 'Ringo Starr', :admin => false)
user.layout_color # => 'blue'
user.admin = true
user.layout_color # => 'black'
That's pretty much it.
Boring stuff
Copyright (c) Fork Ltd. (http://forkhq.com), released under the MIT license.