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
104
105
106
107
108
109
110
|
# File 'app/models/concerns/hancock/hash_field.rb', line 6
def hancock_cms_hash_field(name, opts = {})
opts.merge!({type: Hash, default: {}})
field "#{name}_hash", opts
meth = name
meth_str = "#{name}_str".freeze
meth_hsh = "#{name}_hash".freeze
meth_json = "#{name}_json".freeze
if opts[:localize]
meth_str_t = "#{meth_str}_translations".freeze
meth_hsh_t = "#{meth_hsh}_translations".freeze
class_eval <<-EVAL
def #{meth_str_t}=(val)
return self.#{meth_hsh_t} = {} if val.blank?
_hash = {}
self[:#{meth_str_t}] ||= {}
I18n.available_locales.each do |l|
begin
_hash[l] = JSON.parse(val[l])
self[:#{meth_str_t}][l]= val[l]
rescue
self[:#{meth_str_t}][l]= val[l]
end
end
self.#{meth_hsh_t} = _hash
end
def #{meth_str_t}
self[:#{meth_str_t}] ||= self.#{meth} if self.#{meth}
end
def #{meth_str}
self.#{meth_str_t}[I18n.locale] if self.#{meth_str_t}
end
def #{meth}
self.#{meth_hsh}
end
def #{meth}=(val)
self.#{meth_str} = val
end
def #{meth_json}
self.#{meth_hsh}.to_json if self.#{meth_hsh}
end
validate do
unless self.#{meth_hsh_t}.nil?
_has_errors = false
I18n.available_locales.each do |l|
I18n.with_locale(l) do
if self.#{meth_hsh_t}[l].nil? and !self[:#{meth_str_t}][l].blank?
_has_errors ||= true
_meth = "#{meth_hsh_t}_\#{l}".to_s
self.errors.add(_meth, "Неверный формат данных")
else
self[:#{meth_str_t}].delete(l) if self[:#{meth_str_t}]
end
end
end
self.remove_attribute :#{meth_str_t} unless _has_errors
end
true
end
EVAL
else
class_eval <<-EVAL
def #{meth_str}=(val)
return self.#{meth_hsh} = {} if val.blank?
if val.is_a?(String)
begin
begin
self[:#{meth_str}] = JSON.parse(val)
rescue
self[:#{meth_str}] = YAML.load(val)
end
rescue
end
elsif val.is_a?(Hash)
self[:#{meth_str}] = val
end
end
def #{meth_str}
self[:#{meth_str}] ||= self.#{meth}.to_json if self.#{meth}
end
def #{meth}
self.#{meth_hsh}
end
def #{meth}=(val)
self.#{meth_str} = val
end
def #{meth_json}
self.#{meth_hsh}.to_json if self.#{meth_hsh}
end
validate do
unless self.#{meth}.nil?
if self.#{meth_str} != self.#{meth}.to_json
self.errors.add(:#{meth}, "Неверный формат данных")
else
self.remove_attribute :#{meth_str}
end
true
end
end
EVAL
end
end
|