forked from ledermann/rails-settings
/
settings.rb
103 lines (85 loc) · 2.3 KB
/
settings.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
class Settings < ActiveRecord::Base
class SettingNotFound < RuntimeError; end
cattr_accessor :defaults
@@defaults = {}.with_indifferent_access
# Support old plugin
if defined?(SettingsDefaults::DEFAULTS)
@@defaults = SettingsDefaults::DEFAULTS.with_indifferent_access
end
#get or set a variable with the variable as the called method
def self.method_missing(method, *args)
method_name = method.to_s
super(method, *args)
rescue NoMethodError
#set a value for a variable
if method_name =~ /=$/
var_name = method_name.gsub('=', '')
value = args.first
self[var_name] = value
#retrieve a value
else
self[method_name]
end
end
#destroy the specified settings record
def self.destroy(var_name)
var_name = var_name.to_s
if self[var_name]
object(var_name).destroy
true
else
raise SettingNotFound, "Setting variable \"#{var_name}\" not found"
end
end
#retrieve all settings as a hash
def self.all
vars = find(:all, :select => 'var, value')
result = {}
vars.each do |record|
result[record.var] = record.value
end
result.with_indifferent_access
end
#retrieve a setting value
def self.get(var_name)
if var = object(var_name)
var.value
elsif @@defaults[var_name.to_s]
@@defaults[var_name.to_s]
else
nil
end
end
#set a setting value
def self.set(var_name, value)
var_name = var_name.to_s
record = object(var_name) || Settings.new(:var => var_name)
record.value = value
record.save
value
end
#get a setting value by [] notation
def self.[](var_name)
self.get(var_name)
end
#set a setting value by [] notation
def self.[]=(var_name, value)
self.set(var_name, value)
end
#retrieve the actual Setting record
def self.object(var_name)
self.scoped_by_object_type_and_object_id(nil, nil).find_by_var(var_name.to_s)
end
#get the value field, YAML decoded
def value
YAML::load(self[:value])
end
#set the value field, YAML encoded
def value=(new_value)
self[:value] = new_value.to_yaml
end
#Deprecated!
def self.reload # :nodoc:
self
end
end