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



54
55
56
57
# File 'lib/active_admin/view_helpers/display_helper.rb', line 54

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)


106
107
108
109
110
111
112
113
114
115
# File 'lib/active_admin/view_helpers/display_helper.rb', line 106

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
29
30
31
32
33
34
35
# File 'lib/active_admin/view_helpers/display_helper.rb', line 26

def display_name(resource)
  unless resource.nil?
    result = render_in_context(resource, display_name_method_for(resource))
    if result.to_s&.strip&.present?
      ERB::Util.html_escape(result)
    else
      ERB::Util.html_escape(render_in_context(resource, DISPLAY_NAME_FALLBACK))
    end
  end
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.



40
41
42
43
44
45
46
47
48
49
50
51
52
# File 'lib/active_admin/view_helpers/display_helper.rb', line 40

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



71
72
73
74
75
76
77
78
79
# File 'lib/active_admin/view_helpers/display_helper.rb', line 71

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



59
60
61
62
63
64
65
66
67
68
69
# File 'lib/active_admin/view_helpers/display_helper.rb', line 59

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



102
103
104
# File 'lib/active_admin/view_helpers/display_helper.rb', line 102

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



82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
# File 'lib/active_admin/view_helpers/display_helper.rb', line 82

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