Class: Configurable

Inherits:
ActiveRecord::Base
  • Object
show all
Defined in:
app/models/configurable.rb

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.[](key) ⇒ Object



32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
# File 'app/models/configurable.rb', line 32

def self.[](key)
  return parse_value key, defaults[key][:default] unless table_exists?

  config = if ConfigurableEngine::Engine.config.use_cache
    Rails.cache.fetch("configurable_engine:#{key}") {
      find_by_name(key)
    }
  else
    find_by_name(key)
  end

  return parse_value key, defaults[key][:default] unless config

  config.value
end

.[]=(key, value) ⇒ Object



23
24
25
26
27
28
29
30
# File 'app/models/configurable.rb', line 23

def self.[]=(key, value)
  exisiting = find_by_name(key)
  if exisiting
    exisiting.update_attribute(:value, value)
  else
    create {|c| c.name = key.to_s; c.value = value}
  end
end

.defaultsObject



11
12
13
14
15
16
17
# File 'app/models/configurable.rb', line 11

def self.defaults
  @defaults ||= HashWithIndifferentAccess.new(
    YAML.load_file(
      Rails.root.join('config', 'configurable.yml')
    )
  )
end

.keysObject



19
20
21
# File 'app/models/configurable.rb', line 19

def self.keys
  self.defaults.collect { |k,v| k.to_s }.sort
end

.method_missing(name, *args) ⇒ Object



88
89
90
91
92
93
94
95
96
97
98
99
# File 'app/models/configurable.rb', line 88

def self.method_missing(name, *args)
  name_stripped = name.to_s.sub(/[\?=]$/, '')
  if self.keys.include?(name_stripped)
    if name.to_s.end_with?('=')
      self[name_stripped] = args.first
    else
      self[name_stripped]
    end
  else
    super
  end
end

.parse_value(key, value) ⇒ Object



52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
# File 'app/models/configurable.rb', line 52

def self.parse_value key, value
  case defaults[key][:type]
  when 'boolean'
    [true, 1, "1", "t", "true"].include?(value)
  when 'decimal'
    value ||= 0
    BigDecimal.new(value.to_s)
  when 'integer'
    value.to_i
  when 'list'
    value ||= []
    if value.is_a? Array
      value
    else
      value.split("\n").collect { |v| v =~ /,/ ? v.split(',') : v }
    end
  else
    value
  end
end

.serialized_value(key) ⇒ Object



73
74
75
# File 'app/models/configurable.rb', line 73

def self.serialized_value key
  value_for_serialization key, self[key]
end

.value_for_serialization(key, value) ⇒ Object



77
78
79
80
81
82
83
84
85
86
# File 'app/models/configurable.rb', line 77

def self.value_for_serialization(key, value)
  if defaults[key][:type] == 'list' && value.is_a?(Array)
    if value.all? {|entry| entry.is_a? Array}
      value = value.collect {|entry| entry.join ','}
    end
    value.join("\n")
  else
    value.to_s
  end.gsub("\r\n","\n")
end

Instance Method Details

#valueObject



48
49
50
# File 'app/models/configurable.rb', line 48

def value
  self.class.parse_value name, super
end