module Tabulatr::JsonBuilder

Public Class Methods

build(data, klass, requested_attributes, id="id") click to toggle source
# File lib/tabulatr/json_builder.rb, line 25
def self.build(data, klass, requested_attributes, id="id")
  if klass && ActiveModel.const_defined?(:ArraySerializer)
    ActiveModel::ArraySerializer.new(data,
      { root: "data", meta: data.__pagination,
        each_serializer: klass
      }).as_json
  else
    attrs = build_hash_from requested_attributes, id
    result = []
    data.each do |f|
      tmp = {}
      attrs.each do |at|
        insert_attribute_in_hash(at, f, tmp)
      end
      tmp['_row_config'] = f['_row_config']
      result << tmp
    end
    { data: result, meta: data.__pagination }
  end
end

Private Class Methods

build_hash_from(requested_attributes, id) click to toggle source
# File lib/tabulatr/json_builder.rb, line 48
def self.build_hash_from requested_attributes, id
  attrs = []
  id_included = false
  requested_attributes ||= ''
  requested_attributes.split(',').each do |par|
    if par.include? ':'
      relation, action = par.split(':')
      attrs << {action: action, relation: relation}
    else
      id_included = true if par == id
      attrs << {action: par}
    end
  end
  attrs << {action: id} unless id_included
  attrs
end
check_if_attribute_is_in_hash(hash, key) click to toggle source
# File lib/tabulatr/json_builder.rb, line 81
def self.check_if_attribute_is_in_hash hash, key
  if !hash.has_key?(key)
    raise Tabulatr::RequestDataNotIncludedError.raise_error(key, hash)
  end
end
insert_attribute_in_hash(at, f, r={}) click to toggle source
# File lib/tabulatr/json_builder.rb, line 65
def self.insert_attribute_in_hash at, f, r={}
  action = at[:action].to_sym
  relation = at[:relation].try(:to_sym)
  if at.has_key? :relation
    check_if_attribute_is_in_hash(f, relation)
    check_if_attribute_is_in_hash(f[relation], action) if action != :id
    set_value_at_key(r, f[relation][action], "#{at[:relation]}:#{at[:action]}")
  else
    check_if_attribute_is_in_hash(f, action) if [:checkbox, :id].exclude?(action)
    set_value_at_key(r, f[action], at[:action])
  end
  r
end
set_value_at_key(hash, value, key) click to toggle source
# File lib/tabulatr/json_builder.rb, line 87
def self.set_value_at_key hash, value, key
  begin
    hash[key] = value
  rescue TypeError, NoMethodError => e
    raise Tabulatr::RequestDataNotIncludedError.raise_error(key, value)
  end
end