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

Constant Summary collapse

RESERVED_WORDS =
['fields'].freeze

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(object) ⇒ ApplicationDecorator



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

def initialize(object)
  @object = object
end

Class Method Details

.collectionsObject



24
25
26
# File 'app/decorators/tramway/core/application_decorator.rb', line 24

def collections
  [:all]
end

.decorate(object_or_array) ⇒ Object



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

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



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

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)
    if association.nil?
      error = Tramway::Error.new(plugin: :core, method: :decorate_association, message: "Model #{object.class} does not have association named `#{association_name}`")
      raise error.message
    end
    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



28
29
30
# File 'app/decorators/tramway/core/application_decorator.rb', line 28

def list_attributes
  []
end

.model_classObject



82
83
84
# File 'app/decorators/tramway/core/application_decorator.rb', line 82

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

.model_nameObject



86
87
88
# File 'app/decorators/tramway/core/application_decorator.rb', line 86

def model_name
  model_class.try(:model_name)
end

.show_associationsObject



36
37
38
# File 'app/decorators/tramway/core/application_decorator.rb', line 36

def show_associations
  []
end

.show_attributesObject



32
33
34
# File 'app/decorators/tramway/core/application_decorator.rb', line 32

def show_attributes
  []
end

Instance Method Details

#associations(associations_type) ⇒ Object



113
114
115
116
117
# File 'app/decorators/tramway/core/application_decorator.rb', line 113

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

#attributesObject



123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
# File 'app/decorators/tramway/core/application_decorator.rb', line 123

def attributes
  object.attributes.reduce({}) do |hash, attribute|
    if attribute[0].in? RESERVED_WORDS
      error = Tramway::Error.new(
        plugin: :core,
        method: :attributes,
        message: "Method `#{attribute[0]}` is reserved word. Please, create or delegate method in #{self.class.name} with another name."
      )
      raise error.message
    end
    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


94
95
96
97
98
99
100
101
102
103
104
105
# File 'app/decorators/tramway/core/application_decorator.rb', line 94

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



109
110
111
# File 'app/decorators/tramway/core/application_decorator.rb', line 109

def model
  object
end

#nameObject



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

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

#public_pathObject



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

def public_path; end

#titleObject



18
19
20
21
# File 'app/decorators/tramway/core/application_decorator.rb', line 18

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



148
149
150
# File 'app/decorators/tramway/core/application_decorator.rb', line 148

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