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 <<-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