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 " def \#{meth_str_t}=(val)\n return self.\#{meth_hsh_t} = {} if val.blank?\n _hash = {}\n self[:\#{meth_str_t}] ||= {}\n I18n.available_locales.each do |l|\n begin\n _hash[l] = JSON.parse(val[l])\n self[:\#{meth_str_t}][l]= val[l]\n rescue\n self[:\#{meth_str_t}][l]= val[l]\n end\n end\n self.\#{meth_hsh_t} = _hash\n end\n def \#{meth_str_t}\n self[:\#{meth_str_t}] ||= self.\#{meth} if self.\#{meth}\n end\n def \#{meth_str}\n self.\#{meth_str_t}[I18n.locale] if self.\#{meth_str_t}\n end\n def \#{meth}\n self.\#{meth_hsh}\n end\n def \#{meth}=(val)\n self.\#{meth_str} = val\n end\n def \#{meth_json}\n self.\#{meth_hsh}.to_json if self.\#{meth_hsh}\n end\n\n validate do\n unless self.\#{meth_hsh_t}.nil?\n _has_errors = false\n I18n.available_locales.each do |l|\n I18n.with_locale(l) do\n if self.\#{meth_hsh_t}[l].nil? and !self[:\#{meth_str_t}][l].blank?\n _has_errors ||= true\n _meth = \"\#{meth_hsh_t}_\\\#{l}\".to_s\n self.errors.add(_meth, \"\u041D\u0435\u0432\u0435\u0440\u043D\u044B\u0439 \u0444\u043E\u0440\u043C\u0430\u0442 \u0434\u0430\u043D\u043D\u044B\u0445\")\n else\n self[:\#{meth_str_t}].delete(l) if self[:\#{meth_str_t}]\n end\n end\n end\n self.remove_attribute :\#{meth_str_t} unless _has_errors\n end\n true\n end\n EVAL\n\n else\n class_eval <<-EVAL\n def \#{meth_str}=(val)\n return self.\#{meth_hsh} = {} if val.blank?\n if val.is_a?(String)\n begin\n begin\n self[:\#{meth_str}] = JSON.parse(val)\n rescue\n self[:\#{meth_str}] = YAML.load(val)\n end\n rescue\n end\n elsif val.is_a?(Hash)\n self[:\#{meth_str}] = val\n end\n end\n def \#{meth_str}\n self[:\#{meth_str}] ||= self.\#{meth}.to_json if self.\#{meth}\n end\n def \#{meth}\n self.\#{meth_hsh}\n end\n def \#{meth}=(val)\n self.\#{meth_str} = val\n end\n def \#{meth_json}\n self.\#{meth_hsh}.to_json if self.\#{meth_hsh}\n end\n\n validate do\n unless self.\#{meth}.nil?\n if self.\#{meth_str} != self.\#{meth}.to_json\n self.errors.add(:\#{meth}, \"\u041D\u0435\u0432\u0435\u0440\u043D\u044B\u0439 \u0444\u043E\u0440\u043C\u0430\u0442 \u0434\u0430\u043D\u043D\u044B\u0445\")\n else\n self.remove_attribute :\#{meth_str}\n end\n true\n end\n end\n EVAL\n end\nend\n"
|