Module: HasSetting

Extended by:
ActiveSupport::Concern
Defined in:
lib/has_setting/version.rb,
lib/has_setting/formatters.rb,
lib/has_setting/ar_extensions.rb

Defined Under Namespace

Modules: ClassMethods, Formatters Classes: Setting

Constant Summary collapse

VERSION =
"1.0.2"

Instance Method Summary collapse

Instance Method Details

#has_setting_option(name) ⇒ Object



87
88
89
90
91
92
93
94
95
96
97
98
# File 'lib/has_setting/ar_extensions.rb', line 87

def has_setting_option name
  klass = self.class
  option = klass.has_setting_options ? klass.has_setting_options[name] : nil
  while option.nil? and
        klass.superclass != ActiveRecord::Base and
        klass.superclass.respond_to?(:has_setting_options) and
        klass.superclass.has_setting_options
    klass = klass.superclass
    option = klass.has_setting_options[name]
  end
  option
end

#localize?(name) ⇒ Boolean

Returns:

  • (Boolean)


77
78
79
80
# File 'lib/has_setting/ar_extensions.rb', line 77

def localize? name
  options = has_setting_option name
  options ? options[:localize] : false
end

#no_fallback?(name) ⇒ Boolean

Returns:

  • (Boolean)


82
83
84
85
# File 'lib/has_setting/ar_extensions.rb', line 82

def no_fallback? name
  options = has_setting_option name
  options ? options[:no_fallback] : false
end

#read_setting(name) ⇒ Object



68
69
70
71
72
73
74
75
# File 'lib/has_setting/ar_extensions.rb', line 68

def read_setting(name)
  # use detect instead of SQL find. like this the 'cached' has_many-collection is inited
  # only once
  locale = localize?(name) ? I18n.locale.to_s : ""
  s = self.settings.detect() {|item| item.name == name and item.locale.to_s == locale} # first see if there is a setting with current locale
  s ||= self.settings.detect() {|item| item.name == name} unless no_fallback?(name) # then if not found, take the first setting with matching name (TODO: add locale fallbacks)
  s
end

#write_setting(name, value) ⇒ Object



57
58
59
60
61
62
63
64
65
66
# File 'lib/has_setting/ar_extensions.rb', line 57

def write_setting(name, value)
  # find an existing setting or build a new one
  locale = localize?(name) ? I18n.locale : nil
  setting = self.settings.detect() {|item| item.name == name and item.locale.to_s == locale.to_s }
  setting = self.settings.build(:name => name, locale: locale) if setting.blank?
  setting.value = value
  # mark model as changed to make sure model is saved so that after_save is triggered even if only settings change
  # maybe there is a better way of doing this.
  self.updated_at = Time.now if self.respond_to?(:updated_at)
end