Class: Tramway::Core::ApplicationDecorator

Inherits:
Object
  • Object
show all
Includes:
ActionView::Context, ActionView::Helpers, FontAwesome::Rails::IconHelper
Defined in:
app/decorators/tramway/core/application_decorator.rb

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(object) ⇒ ApplicationDecorator

Returns a new instance of ApplicationDecorator.



6
7
8
# File 'app/decorators/tramway/core/application_decorator.rb', line 6

def initialize(object)
  @object = object
end

Class Method Details

.decorate(object_or_array) ⇒ Object



19
20
21
22
23
24
25
26
27
28
# File 'app/decorators/tramway/core/application_decorator.rb', line 19

def decorate(object_or_array)
  if object_or_array.class.superclass == ActiveRecord::Relation
    decorated_array = object_or_array.map do |obj|
      new obj
    end
    Tramway::Core::ApplicationDecoratedCollection.new decorated_array, object_or_array
  else
    new object_or_array
  end
end

.decorate_association(association_name, decorator: nil) ⇒ Object



30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
# File 'app/decorators/tramway/core/application_decorator.rb', line 30

def decorate_association(association_name, decorator: nil)
  @@decorated_associations ||= []
  @@decorated_associations << association_name

  define_method association_name do
    class_name = object.class.reflect_on_association(association_name).options[:class_name]
    #FIXME use error abstraction
    unless class_name
      raise "Please, specify `#{association_name}` association class_name in #{object.class} model. For example: `has_many :#{association_name}, class_name: 'ModelName'`"
    end

    object.send(association_name).active.map do |association_object|
      decorator_class_name = decorator || "#{class_name.singularize}Decorator".constantize
      decorator_class_name.decorate association_object
    end
  end
end

.list_attributesObject



15
16
17
# File 'app/decorators/tramway/core/application_decorator.rb', line 15

def list_attributes
  []
end

Instance Method Details

#associations(associations_type) ⇒ Object



61
62
63
64
65
# File 'app/decorators/tramway/core/application_decorator.rb', line 61

def associations(associations_type)
  object.class.reflect_on_all_associations(associations_type).map do |association|
    association unless association.name == :audits
  end.compact
end

#attributesObject



67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
# File 'app/decorators/tramway/core/application_decorator.rb', line 67

def attributes
  object.attributes.reduce({}) do |hash, attribute|
    value = try(attribute[0]) ? send(attribute[0]) : object.send(attribute[0])
    if attribute[0].to_s.in? object.class.state_machines.keys.map(&:to_s)
      hash.merge! attribute[0] => object.send("human_#{attribute[0]}_name")
    elsif value.class.in? [ ActiveSupport::TimeWithZone, DateTime, Time ]
      hash.merge! attribute[0] => I18n.l(attribute[1])
    elsif value.class.superclass == ApplicationUploader
      tags = (:div) do
        if value.url.match(/jpg|JPG|png|PNG$/)
          concat image_tag value.try(:small) ? value.small.url : value.url
        end
        concat link_to(fa_icon(:download), value.url, class: 'btn btn-success')
      end
      hash.merge! attribute[0] => tags
    elsif value.is_a? Enumerize::Value
      hash.merge! attribute[0] => value.text
    else
      hash.merge! attribute[0] => value
    end
  end
end


53
54
55
# File 'app/decorators/tramway/core/application_decorator.rb', line 53

def link
  object.file.url
end

#modelObject



57
58
59
# File 'app/decorators/tramway/core/application_decorator.rb', line 57

def model
  object
end

#nameObject



10
11
12
# File 'app/decorators/tramway/core/application_decorator.rb', line 10

def name
  object.try(:name) || object.try(:title) || title
end