Class: Tramway::Core::ApplicationDecorator

Inherits:
Object
  • Object
show all
Includes:
ActionView::Context, ActionView::Helpers, FontAwesome5::Rails::IconHelper, Concerns::AttributesDecoratorHelper
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.



8
9
10
# File 'app/decorators/tramway/core/application_decorator.rb', line 8

def initialize(object)
  @object = object
end

Class Method Details

.collectionsObject



22
23
24
# File 'app/decorators/tramway/core/application_decorator.rb', line 22

def collections
  [:all]
end

.decorate(object_or_array) ⇒ Object



38
39
40
41
42
43
44
45
46
47
# File 'app/decorators/tramway/core/application_decorator.rb', line 38

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



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
# File 'app/decorators/tramway/core/application_decorator.rb', line 49

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

  define_method association_name do
    association = object.class.reflect_on_association(association_name)
    class_name = if association.polymorphic?
                   object.send(association_name).class
                 else
                   unless association.options[:class_name]
                     error = Tramway::Error.new(plugin: :core, method: :decorate_association, message: ("Please, specify `#{association_name}` association class_name in #{object.class} model. For example: `has_many :#{association_name}, class_name: '#{association_name.to_s.singularize.camelize}'`"))
                     raise error.message
                   end
                   association.options[:class_name]
                 end
    decorator_class_name = decorator || "#{class_name.to_s.singularize}Decorator".constantize
    if association.class == ActiveRecord::Reflection::HasManyReflection
      return object.send(association_name).active.map do |association_object|
        decorator_class_name.decorate association_object
      end
    end
    if association.class == ActiveRecord::Reflection::BelongsToReflection
      return decorator_class_name.decorate object.send association_name
    end
  end
end

.list_attributesObject



26
27
28
# File 'app/decorators/tramway/core/application_decorator.rb', line 26

def list_attributes
  []
end

.model_classObject



76
77
78
# File 'app/decorators/tramway/core/application_decorator.rb', line 76

def model_class
  self.to_s.sub(/Decorator$/, '').constantize
end

.model_nameObject



80
81
82
# File 'app/decorators/tramway/core/application_decorator.rb', line 80

def model_name
  model_class.try(:model_name)
end

.show_associationsObject



34
35
36
# File 'app/decorators/tramway/core/application_decorator.rb', line 34

def show_associations
  []
end

.show_attributesObject



30
31
32
# File 'app/decorators/tramway/core/application_decorator.rb', line 30

def show_attributes
  []
end

Instance Method Details

#associations(associations_type) ⇒ Object



106
107
108
109
110
# File 'app/decorators/tramway/core/application_decorator.rb', line 106

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

#attributesObject



114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
# File 'app/decorators/tramway/core/application_decorator.rb', line 114

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] => state_machine_view(object, attribute[0])
    elsif value.class.in? [ ActiveSupport::TimeWithZone, DateTime, Time ]
      hash.merge! attribute[0] => datetime_view(attribute[1])
    elsif value.class.superclass == ApplicationUploader
      hash.merge! attribute[0] => image_view(object.send(attribute[0]))
    elsif value.is_a? Enumerize::Value
      hash.merge! attribute[0] => enumerize_view(value)
    else
      hash.merge! attribute[0] => value
    end
  end
end


88
89
90
91
92
93
94
95
96
97
98
# File 'app/decorators/tramway/core/application_decorator.rb', line 88

def link
  if object.try :file
    object.file.url
  else
    error = Tramway::Error.new(
      plugin: :core,
      method: :link,
      message: ("Method `link` uses `file` attribute of the decorated object. If decorated object doesn't contain `file`, you shouldn't use `link` method."))
    raise error.message
  end
end

#modelObject



102
103
104
# File 'app/decorators/tramway/core/application_decorator.rb', line 102

def model
  object
end

#nameObject



12
13
14
# File 'app/decorators/tramway/core/application_decorator.rb', line 12

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

#public_pathObject



100
# File 'app/decorators/tramway/core/application_decorator.rb', line 100

def public_path; end

#titleObject



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

def title
  error = Tramway::Error.new(plugin: :core, method: :title, message: ("Please, implement `title` method in a #{self.class} or #{object.class}"))
  raise error.message
end

#yes_no(boolean_attr) ⇒ Object



131
132
133
# File 'app/decorators/tramway/core/application_decorator.rb', line 131

def yes_no(boolean_attr)
  boolean_attr.to_s == 'true' ? I18n.t('helpers.yes') : I18n.t('helpers.no')
end