diff --git a/README.md b/README.md index 442a2dc3..a8ddcdff 100644 --- a/README.md +++ b/README.md @@ -65,6 +65,26 @@ class ProjectSettingObject < RailsSettings::SettingObject end ``` +In case you need to define settings separatedly for the same models, you can use the persistent option + +```ruby +module UserDashboardConcern + extend ActiveSupport::Concern + + included do + has_settings persistent: true do |s| + s.key :dashboard + end + end +end + +class User < ActiveRecord::Base + has_settings persistent: true do |s| + s.key :calendar + end +end +``` + ### Set settings ```ruby diff --git a/lib/rails-settings/configuration.rb b/lib/rails-settings/configuration.rb index 7a275e92..388a3420 100644 --- a/lib/rails-settings/configuration.rb +++ b/lib/rails-settings/configuration.rb @@ -8,8 +8,15 @@ def initialize(*args, &block) raise ArgumentError unless klass @klass = klass - @klass.class_attribute :default_settings, :setting_object_class_name - @klass.default_settings = {} + + if options[:persistent] + @klass.class_attribute :default_settings unless @klass.methods.include?(:default_settings) + else + @klass.class_attribute :default_settings + end + + @klass.class_attribute :setting_object_class_name + @klass.default_settings ||= {} @klass.setting_object_class_name = options[:class_name] || 'RailsSettings::SettingObject' if block_given? diff --git a/lib/rails-settings/version.rb b/lib/rails-settings/version.rb index 6a4451d6..0c64a9e9 100644 --- a/lib/rails-settings/version.rb +++ b/lib/rails-settings/version.rb @@ -1,3 +1,3 @@ module RailsSettings - VERSION = '2.4.3' + VERSION = '2.4.4' end diff --git a/spec/configuration_spec.rb b/spec/configuration_spec.rb index 63089d51..de8608c5 100644 --- a/spec/configuration_spec.rb +++ b/spec/configuration_spec.rb @@ -61,6 +61,18 @@ class Dummy expect(Dummy.default_settings).to eq({ :dashboard => {}, :calendar => {} }) expect(Dummy.setting_object_class_name).to eq('MyClass') end + + context 'persistent' do + it "should keep settings between multiple configurations initialization" do + Configuration.new(Dummy, :persistent => true) do |c| + c.key :dashboard, :defaults => { :theme => 'red' } + end + + Configuration.new(Dummy, :calendar, :persistent => true) + + expect(Dummy.default_settings).to eq({ :dashboard => { 'theme' => 'red' }, :calendar => {} }) + end + end end describe Configuration, 'failure' do