Module: ActiveAdmin::ViewHelpers::DisplayHelper

Included in:
ActiveAdmin::ViewHelpers
Defined in:
lib/active_admin/view_helpers/display_helper.rb

Constant Summary collapse

DISPLAY_NAME_FALLBACK =
-> {
  klass = self.class
  name = if klass.respond_to?(:model_name)
           if klass.respond_to?(:primary_key)
             "#{klass.model_name.human} ##{send(klass.primary_key)}"
           else
             klass.model_name.human
           end
         elsif klass.respond_to?(:primary_key)
           " ##{send(klass.primary_key)}"
         end
  name.present? ? name : to_s
}

Instance Method Summary collapse

Instance Method Details

#association_methods_for(resource) ⇒ Object



47
48
49
50
# File 'lib/active_admin/view_helpers/display_helper.rb', line 47

def association_methods_for(resource)
  return [] unless resource.class.respond_to? :reflect_on_all_associations
  resource.class.reflect_on_all_associations.map(&:name)
end

#boolean_attr?(resource, attr, value) ⇒ Boolean

Returns:

  • (Boolean)


99
100
101
102
103
104
105
106
107
108
# File 'lib/active_admin/view_helpers/display_helper.rb', line 99

def boolean_attr?(resource, attr, value)
  case value
  when TrueClass, FalseClass
    true
  else
    if resource.class.respond_to? :columns_hash
      column = resource.class.columns_hash[attr.to_s] and column.type == :boolean
    end
  end
end

#display_name(resource) ⇒ Object

Attempts to call any known display name methods on the resource. See the setting in `application.rb` for the list of methods and their priority.



26
27
28
# File 'lib/active_admin/view_helpers/display_helper.rb', line 26

def display_name(resource)
  ERB::Util.html_escape(render_in_context(resource, display_name_method_for(resource))) unless resource.nil?
end

#display_name_method_for(resource) ⇒ Object

Looks up and caches the first available display name method. To prevent conflicts, we exclude any methods that happen to be associations. If no methods are available and we're about to use the Kernel's `to_s`, provide our own.



33
34
35
36
37
38
39
40
41
42
43
44
45
# File 'lib/active_admin/view_helpers/display_helper.rb', line 33

def display_name_method_for(resource)
  @@display_name_methods_cache ||= {}
  @@display_name_methods_cache[resource.class] ||= begin
    methods = active_admin_application.display_name_methods - association_methods_for(resource)
    method = methods.detect { |method| resource.respond_to? method }

    if method != :to_s || resource.method(method).source_location
      method
    else
      DISPLAY_NAME_FALLBACK
    end
  end
end

#find_value(resource, attr) ⇒ Object



64
65
66
67
68
69
70
71
72
# File 'lib/active_admin/view_helpers/display_helper.rb', line 64

def find_value(resource, attr)
  if attr.is_a? Proc
    attr.call resource
  elsif resource.respond_to? attr
    resource.public_send attr
  elsif resource.respond_to? :[]
    resource[attr]
  end
end

#format_attribute(resource, attr) ⇒ Object



52
53
54
55
56
57
58
59
60
61
62
# File 'lib/active_admin/view_helpers/display_helper.rb', line 52

def format_attribute(resource, attr)
  value = find_value resource, attr

  if value.is_a?(Arbre::Element)
    value
  elsif boolean_attr?(resource, attr, value)
    Arbre::Context.new { status_tag value }
  else
    pretty_format value
  end
end

#format_collection(collection) ⇒ Object



95
96
97
# File 'lib/active_admin/view_helpers/display_helper.rb', line 95

def format_collection(collection)
  safe_join(collection.map { |item| pretty_format(item) }, ", ")
end

#pretty_format(object) ⇒ Object

Attempts to create a human-readable string for any object



75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
# File 'lib/active_admin/view_helpers/display_helper.rb', line 75

def pretty_format(object)
  case object
  when String, Numeric, Symbol, Arbre::Element
    object.to_s
  when Date, Time
    I18n.localize object, format: active_admin_application.localize_format
  when Array
    format_collection(object)
  else
    if defined?(::ActiveRecord) && object.is_a?(ActiveRecord::Base) ||
       defined?(::Mongoid) && object.class.include?(Mongoid::Document)
      auto_link object
    elsif defined?(::ActiveRecord) && object.is_a?(ActiveRecord::Relation)
      format_collection(object)
    else
      display_name object
    end
  end
end