Method: CustomTable::ApplicationHelper#field_value_for

Defined in:
app/helpers/custom_table/application_helper.rb

#field_value_for(item, field, definitions: nil, variant: nil) ⇒ Object

Tries to fetch attribute value by all possible ways (by priority): Helper singular_model_name_field_field Helper singular_model_name_field Helper singular_model_name_field_raw Attribute of model



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
111
112
113
114
115
116
117
# File 'app/helpers/custom_table/application_helper.rb', line 38

def field_value_for item, field, definitions: nil, variant: nil
 
  defs = definitions

  model_name = item.model_name.singular
  global_model_name = item.class.model_name.singular # non-model

  helpers = []
  helpers += [defs[:helper]] if !defs.nil?

  helpers += [
    "#{model_name}_#{variant}_#{field}_field",
    "#{model_name}_#{variant}_#{field}",
  ] if !variant.nil?

  helpers += [
    "#{model_name}_#{field}_field",
    "#{model_name}_#{field}",
    "#{model_name}_#{field}_raw",
    "#{global_model_name}_#{field}"
  ]

  if item.class.superclass.to_s != "ApplicationRecord"
    super_model_name = item.class.superclass.model_name.singular
    helpers += [
      "#{super_model_name}_#{field}_field",
      "#{super_model_name}_#{field}",
      "#{super_model_name}_#{field}_raw",
    ] 
  end

  helpers = helpers.flatten.compact

  helpers.each do |helper|
    if self.class.method_defined?(helper)
      if self.method(helper).arity == 1 || self.method(helper).arity == -2
        return self.send(helper, item) || not_set 
      end
      if self.method(helper).arity == 2
        return self.send(helper, item, field) || not_set 
      end
    end
  end
  
  if !defs.nil? && defs[:amount]
    val = item.send(field) rescue nil
    return not_set if val.nil?
    if !item.class.columns_hash[field.to_s].nil? && item.class.columns_hash[field.to_s].type == :integer
      # Integer only
      return amount_value(val, 0) rescue ""
    else
      return amount(val) rescue ""
    end
  else
    if item.class.reflect_on_association(field)
      return not_set if (item.send(field) rescue nil).nil?
      return render(item.send(field)) rescue item.send(field).to_s rescue ""
    elsif item.class.columns_hash[field.to_s] && item.class.columns_hash[field.to_s].type == :boolean
      return boolean_icon(item.send(field)) rescue ""
    elsif item.class.defined_enums.has_key?(field.to_s)
      return (item.send("human_#{field}") rescue (item.send(field).presence || not_set)).to_s rescue ""
    elsif item.class.columns_hash[field.to_s] && [:date].include?(item.class.columns_hash[field.to_s].type)
      return (item.send(field).blank? ? not_set : l(item.send(field), format: CustomTable.configuration.date_format)) rescue ""
    elsif item.class.columns_hash[field.to_s] && [:datetime].include?(item.class.columns_hash[field.to_s].type)
      return (item.send(field).blank? ? not_set : l(item.send(field), format: CustomTable.configuration.datetime_format)) rescue ""
    elsif item.class.columns_hash[field.to_s] && [:integer, :float, :decimal].include?(item.class.columns_hash[field.to_s].type)
      return not_set if (item.send(field) rescue nil).nil?
      return item.send(field) if !defs.nil? && defs[:amount] === false # Showing simple output if amount is false
      return amount(item.send(field)) rescue ""
    else
      # Non-column attribute
      v = (item.send(field).presence || not_set) rescue nil
      if !defs.nil? && !defs[:type].nil?
        return date_value(v) if [:date, :datetime].include?(defs[:type])
      end
      return v.to_s.presence || not_set
    end
  end
  
end