active_form_objects 0.1.1 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ee3cf5927221589e50474e415f83f5e9bdcd352acebf6021066e93406a6d63cc
4
- data.tar.gz: c376560619ae6f46a503b3709b3bb3b4eeef146e6f38bb1f6916e1f7d63bb205
3
+ metadata.gz: daff81f1e757efcd09b602052b01108e5975ec4afdbc23eb990d9fd4fad28067
4
+ data.tar.gz: bd751ee1875ac9ff54e70d107106cbc041e499dedd9bb8b44147c0f902ea44eb
5
5
  SHA512:
6
- metadata.gz: 2e2adaedc75a8570cd38141f000e288ec90f387e24e370be544c756404939f817b10bfdb70215a7b4bbd846e8b61d1390f0a6f7184372491222df652f4fb36d5
7
- data.tar.gz: 32bbc95653054c356c9b1efa85e788594d95f6d78c506e3c4ad3483675614462b1f0c82b1ea9b6ea81ef4b8f689a79a7009106e7a4fff76a1587cd6d634f70ba
6
+ metadata.gz: 23909b529fe45a1de257f237698b6be281d1ef4d8ec8d7f09a588783ced45552e4373ca185e6787a23f3be2552a3a8c3b08477b14daef69dc8082ebd1e026a60
7
+ data.tar.gz: 3ed88b54b54be83db842ebb37565eecfe194bc12c970b01b26871ef0d95c0364705ea6b01e376ea6d584fb6877025c34ad6143e23902dc3cb6fb8c9c63ae80e7
@@ -0,0 +1,35 @@
1
+ require 'active_support'
2
+ require 'active_model'
3
+
4
+ module Relations
5
+ extend ActiveSupport::Concern
6
+
7
+ @@relation_keys = {}
8
+
9
+ class RelationValidator < ActiveModel::EachValidator
10
+ def validate_each(record, attribute, value)
11
+ record.errors.add(attribute, "#{attribute} or #{attribute}_id is required") unless record.try(attribute).present? || record.try("#{attribute}_id".to_sym).present?
12
+ end
13
+ end
14
+
15
+ def affect_relation_values(params)
16
+ @relation_keys = @@relation_keys[self.class.name] || []
17
+ params.keys.each do |key|
18
+ params["#{key}_id".to_sym] = params[key.to_sym].id if @relation_keys.include?(key)
19
+ end
20
+
21
+ params
22
+ end
23
+
24
+ class_methods do
25
+ def relations(*params)
26
+ validates *params, relation: true
27
+
28
+ params.each do |param|
29
+ relation_key = "#{param}_id".to_sym
30
+ send(:attributes, param, relation_key)
31
+ @@relation_keys[name] = (@@relation_keys[name] || []) + [param]
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,71 @@
1
+ require 'active_support'
2
+
3
+ module Savings
4
+ extend ActiveSupport::Concern
5
+
6
+ @@associated_forms = {}
7
+
8
+ class_methods do
9
+ def associated(key, form, params = nil)
10
+ @@associated_forms[name] ||= []
11
+ @@associated_forms[name] << { name: key, form: form, params: params }
12
+
13
+ set_default value: {}, to: key
14
+ end
15
+
16
+ def save(&block)
17
+ define_method(:save!) do
18
+ with_rescue do
19
+ ActiveRecord::Base.transaction do
20
+ validate!
21
+ instance_eval(&block)
22
+ @resource.try(:save!)
23
+ end
24
+ @resource
25
+ end
26
+ end
27
+ end
28
+ end
29
+
30
+ def save!
31
+ with_rescue do
32
+ if @@associated_forms[self.class.name].nil?
33
+ validate!
34
+ @resource.update!(@params)
35
+ @resource
36
+ else
37
+ save_associated_forms!
38
+ end
39
+ end
40
+ end
41
+
42
+ def save
43
+ save!
44
+ rescue
45
+ false
46
+ end
47
+
48
+ def save_associated_forms!
49
+ (@@associated_forms[self.class.name] || []).each do |associated|
50
+ params = associated[:params].nil? ? @params[associated[:name]] : send(associated[:params])
51
+ resource_to_save = send("#{associated[:name]}_to_update") rescue nil
52
+ @TheForm = associated[:form]
53
+
54
+ saved_form = @TheForm.new(params, resource_to_save).save!
55
+ instance_variable_set("@#{associated[:name]}", saved_form)
56
+ end
57
+ end
58
+
59
+ def set_associated_forms
60
+ (@@associated_forms[self.class.name] || []).each do |form|
61
+ instance_variable_set("@#{form[:name]}_form", form[:form])
62
+ end
63
+ end
64
+
65
+ def with_rescue
66
+ yield
67
+ rescue ActiveRecord::RecordInvalid => e
68
+ e.record.errors.add(e.record.class.name, '')
69
+ raise ActiveRecord::RecordInvalid.new(e.record)
70
+ end
71
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: active_form_objects
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Michaël Villeneuve
@@ -45,6 +45,8 @@ extensions: []
45
45
  extra_rdoc_files: []
46
46
  files:
47
47
  - lib/active_form_objects.rb
48
+ - lib/concerns/relations.rb
49
+ - lib/concerns/savings.rb
48
50
  homepage: https://github.com/fidme/active_form_objects
49
51
  licenses:
50
52
  - MIT