Class: Setting

Inherits:
ActiveRecord::Base
  • Object
show all
Includes:
Localized
Defined in:
app/models/setting.rb

Defined Under Namespace

Classes: SettingNotFound

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.get(key, default = nil) ⇒ Object



51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
# File 'app/models/setting.rb', line 51

def self.get(key, default = nil)
  cached_settings = Rails.cache.read('fullstack-settings-cache')
  
  unless cached_settings
    cached_settings = {}
    Setting.all.each do |setting|
      l = setting.locale
      g = setting.group
      k = [g, setting.key].compact.join('/')
      cached_settings[l] ||= {}
      cached_settings[l][k] = setting.value if setting.value
    end

    Rails.cache.write('fullstack-settings-cache', cached_settings)
  end
  
  localized_settings    = cached_settings[I18n.locale.to_s] || {}
  unlocalized_settings  = cached_settings[nil] || {}

  key_segments = key.to_s.split("/")
  if key_segments.size == 1
    key_segments.unshift("global")
  end
  
  key = key_segments.join("/")
  
  localized_settings[key] || unlocalized_settings[key] || default
end

.global(key, opts = {}) ⇒ Object

using Setting.get is simpler, expecially if you don’t want ‘autocreate’ feature

Raises:



81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
# File 'app/models/setting.rb', line 81

def self.global(key, opts = {})
  key = key.to_s
  autocreate  = opts.delete(:autocreate)
  kind        = opts.delete(:kind) || :string
  default     = opts.delete(:default)
  group       = (opts.delete(:group) || "global").to_s
  options     = opts.delete(:options)
  locale      = opts.delete(:locale).try(:to_s) 
  
  query = where(:key => key, :group => group, :settable_id => nil)
  
  if locale
    query = query.where(:locale => locale)
  end
      
  setting = query.first ||  (  autocreate && create(
                                  :key => key, 
                                  :locale => locale, 
                                  :kind => kind, 
                                  :"#{kind}_value" => default, 
                                  :group => group, 
                                  :options => options
                                ) 
                            )
  
  raise SettingNotFound.new("Setting `#{[group, key].join('/')}` not found for locale `#{locale || 'any'}`") if !setting
  setting.value || default
  
end

.kindsObject



27
28
29
30
31
32
33
34
35
36
37
# File 'app/models/setting.rb', line 27

def self.kinds
        [ :string,
          :integer,
          :float,
          :boolean,
          :text,
          :datetime,
          :date,
          :file
         ]
end

.update_global(key, value) ⇒ Object



111
112
113
114
115
116
117
# File 'app/models/setting.rb', line 111

def self.update_global(key, value)
  s = self.find_by_key_and_settable_id(key.to_s, nil)

  if s
    s.update_attributes(:value => value)
  end
end

Instance Method Details

#valueObject



39
40
41
42
43
44
45
46
47
48
# File 'app/models/setting.rb', line 39

def value
  setting_kind = self.kind

  # this will break paperclip 'missing.png' feature, but at least
  # provides a way to check if an attachment is missing
  if setting_kind == "file"
    return nil if !file_value?
  end
  self.send("#{setting_kind}_value")
end