Module: Hancock::HashField::ClassMethods

Defined in:
app/models/concerns/hancock/hash_field.rb

Instance Method Summary collapse

Instance Method Details

#hancock_cms_hash_field(name, opts = {}) ⇒ Object



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"