diff --git a/lib/setting_accessors/accessor.rb b/lib/setting_accessors/accessor.rb index 72ff598..e426a24 100644 --- a/lib/setting_accessors/accessor.rb +++ b/lib/setting_accessors/accessor.rb @@ -16,6 +16,18 @@ def [](key) has_key?(key) ? @temp_settings[key.to_sym] : SettingAccessors.setting_class.get(key, @record) end + # + # Tries to fetch a setting value using the provided key and #[]. + # It will only return the +default+ value if there is + # - no temporary setting with the given key AND + # - no already persisted setting (see #[]) + # + def fetch(key, default = nil) + result = self[key] + return default if result.nil? && !has_key?(key) + result + end + def has_key?(key) @temp_settings.has_key?(key.to_sym) end @@ -34,7 +46,7 @@ def []=(key, val) # specified in the setting config file. # def get_or_default(key) - self[key] || SettingAccessors.setting_class.get_or_default(key, @record) + fetch key, SettingAccessors.setting_class.get_or_default(key, @record) end # @@ -42,7 +54,7 @@ def get_or_default(key) # If none is found, tries to find a global setting with the same name # def get_or_global(key) - self[key] || SettingAccessors.setting_class.get(key) + fetch key, SettingAccessors.setting_class.get(key) end # @@ -50,7 +62,7 @@ def get_or_global(key) # if none is found, it will return the given value instead. # def get_or_value(key, value) - self.has_key?(key) ? self[key] : value + fetch key, value end def get_with_fallback(key, fallback = nil) diff --git a/lib/setting_accessors/version.rb b/lib/setting_accessors/version.rb index 34c4847..160738f 100644 --- a/lib/setting_accessors/version.rb +++ b/lib/setting_accessors/version.rb @@ -1,3 +1,3 @@ module SettingAccessors - VERSION = '0.0.7' + VERSION = '0.0.8' end diff --git a/test/dummy/app/models/user.rb b/test/dummy/app/models/user.rb index 7ff38cb..139fde8 100644 --- a/test/dummy/app/models/user.rb +++ b/test/dummy/app/models/user.rb @@ -8,6 +8,8 @@ class User < ActiveRecord::Base setting_accessor :a_boolean, :fallback => false + setting_accessor :class_wise_truthy_boolean, :type => :boolean, :default => true, :fallback => :default + setting_accessor :class_wise_with_value_fallback, :type => :string, :fallback => 'Oiski Poiski!' setting_accessor :class_wise_with_default_fallback, :type => :string, :fallback => :default, :default => 'Kapitanski' diff --git a/test/dummy/test/models/setting_test.rb b/test/dummy/test/models/setting_test.rb index 0a1c9e2..35de427 100644 --- a/test/dummy/test/models/setting_test.rb +++ b/test/dummy/test/models/setting_test.rb @@ -128,4 +128,16 @@ class SettingTest < ActiveSupport::TestCase assert_equal 'Kapitanski', User.new.class_wise_with_default_fallback end end + + context 'Boolean settings' do + should 'respect temporary settings which are set to `false`' do + user = User.new(:class_wise_truthy_boolean => false) + assert_equal user.class_wise_truthy_boolean, false + end + + should 'respect temporary settings which are set to `true`' do + user = User.new(:a_boolean => true) + assert_equal user.a_boolean, true + end + end end diff --git a/test/dummy/test/models/user_test.rb b/test/dummy/test/models/user_test.rb index 30b8ee7..f2b5ecf 100644 --- a/test/dummy/test/models/user_test.rb +++ b/test/dummy/test/models/user_test.rb @@ -17,6 +17,5 @@ class UserTest < ActiveSupport::TestCase assert_equal @user.as_json[setting_name.to_s], @user.send(setting_name) end end - end end