Class: Tramway::Core::ApplicationForm

Inherits:
Reform::Form
  • Object
show all
Defined in:
app/forms/tramway/core/application_form.rb

Direct Known Subclasses

ExtendedApplicationForm

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(object = nil) ⇒ ApplicationForm

Returns a new instance of ApplicationForm.



5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# File 'app/forms/tramway/core/application_form.rb', line 5

def initialize(object = nil)
  object ||= self.class.model_class.new
  super(object).tap do
    @@model_class = object.class
    @@enumerized_attributes = object.class.try :enumerized_attributes
    @@associations ||= []

    self.class.full_class_name_associations.each do |association, class_name|
      if class_name.is_a? Array
        self.class.send(:define_method, "#{association}=") do |value|
          association_class = send("#{association}_type")
          if association_class.nil?
            raise Tramway::Error.new(plugin: :core, method: :initialize, message: 'Polymorphic association class is nil. Maybe, you should write `assocation #{association_name}` after `properties #{association_name}_id, #{association_name}_type`')
          else
            super association_class.constantize.find value
          end
        end
      else
        self.class.send(:define_method, "#{association}=") do |value|
          super class_name.find value
        end
      end
    end

    delegating object
  end
end

Class Method Details

.association(property) ⇒ Object



85
86
87
88
89
# File 'app/forms/tramway/core/application_form.rb', line 85

def association(property)
  properties property
  @@associations ||= []
  @@associations << property
end

.associations(*properties) ⇒ Object



91
92
93
94
95
# File 'app/forms/tramway/core/application_form.rb', line 91

def associations(*properties)
  properties.each do |property|
    association property
  end
end

.enumerized_attributesObject



119
120
121
# File 'app/forms/tramway/core/application_form.rb', line 119

def enumerized_attributes
  @@enumerized_attributes
end

.full_class_name_association(association_name) ⇒ Object



115
116
117
# File 'app/forms/tramway/core/application_form.rb', line 115

def full_class_name_association(association_name)
  full_class_name_associations[association_name]
end

.full_class_name_associationsObject



97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
# File 'app/forms/tramway/core/application_form.rb', line 97

def full_class_name_associations
  @@associations&.reduce({}) do |hash, association|
    options = @@model_class.reflect_on_all_associations(:belongs_to).select do |a|
      a.name == association.to_sym
    end.first&.options

    if options
      if options[:polymorphic]
        hash.merge! association => @@model_class.send("#{association}_type").values
      else
        class_name = options[:class_name] || association.to_s.camelize
        hash.merge!(association => class_name.constantize)
      end
    end
    hash
  end
end

.model_classObject



127
128
129
130
131
132
133
134
135
136
137
138
139
# File 'app/forms/tramway/core/application_form.rb', line 127

def model_class
  if defined?(@@model_class) && @@model_class
    @@model_class
  else
    model_class_name ||= name.to_s.sub(/Form$/, '')
    begin
      @@model_class = model_class_name.constantize
    rescue StandardError
      error = Tramway::Error.new(plugin: :core, method: :model_class, message: "There is not model class name for #{name}. Should be #{model_class_name} or you can use another class to initialize form object or just initialize form with object.")
      raise error.message
    end
  end
end

.reflect_on_association(*args) ⇒ Object



123
124
125
# File 'app/forms/tramway/core/application_form.rb', line 123

def reflect_on_association(*args)
  @@model_class.reflect_on_association(*args)
end

.validates(attribute, **options) ⇒ Object



145
146
147
# File 'app/forms/tramway/core/application_form.rb', line 145

def validates(attribute, **options)
  model_class.validates attribute, **options
end

.validation_group_classObject



141
142
143
# File 'app/forms/tramway/core/application_form.rb', line 141

def validation_group_class
  ActiveModel
end

Instance Method Details

#build_errorsObject



71
# File 'app/forms/tramway/core/application_form.rb', line 71

def build_errors; end

#delegating(object) ⇒ Object



73
74
75
76
77
78
79
80
# File 'app/forms/tramway/core/application_form.rb', line 73

def delegating(object)
  methods = %i[to_key errors]
  methods.each do |method|
    self.class.send(:define_method, method) do
      object.send method
    end
  end
end

#form_properties(**args) ⇒ Object



57
58
59
# File 'app/forms/tramway/core/application_form.rb', line 57

def form_properties(**args)
  @form_properties = args
end

#model_nameObject



53
54
55
# File 'app/forms/tramway/core/application_form.rb', line 53

def model_name
  @@model_class.model_name
end

#propertiesObject



61
62
63
64
65
66
67
68
69
# File 'app/forms/tramway/core/application_form.rb', line 61

def properties
  return @form_properties if @form_properties
  yaml_config_file_path = Rails.root.join('app', 'forms', "#{self.class.name.underscore}.yml")
  if File.exist? yaml_config_file_path
    @form_properties = YAML.load_file(yaml_config_file_path).deep_symbolize_keys
  else
    []
  end
end

#submit(params) ⇒ Object



33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
# File 'app/forms/tramway/core/application_form.rb', line 33

def submit(params)
  if params
    if validate params
      save 
    else
      association_error = false
      @@associations.each do |association|
        if errors.details[association] == [{ error: :blank }]
          model.send("#{association}=", send(association))
          association_error = true
        end
      end
      association_error && save
    end
  else
    error = Tramway::Error.new(plugin: :core, method: :submit, message: 'ApplicationForm::Params should not be nil')
    raise error.message
  end
end