slim_form_object 0.5.14 → 0.5.19
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 +4 -4
- data/lib/slim_form_object.rb +1 -165
- data/lib/slim_form_object/helpers.rb +7 -1
- data/lib/slim_form_object/processing.rb +163 -0
- data/lib/slim_form_object/version.rb +1 -1
- data/spec/slim_form_object_spec.rb +3 -3
- metadata +5 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 239fc8e0a836b0c614a1b7607a7775057f5f91cf
|
4
|
+
data.tar.gz: a1240a1e9dd26ca7bdb0d39744c7d99f07ebee6f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1cb24a67ce6370d71bc00c7ae71a9720db254bca41c7992f0ac4b9f3d4023628f4860166895aa0e5d153f4515a05a095630a3c3f07da291e783b929edfaf148c
|
7
|
+
data.tar.gz: cae3003ff4b6f04744ab92c1ba96aa955cdf2e29ff2153e91c0c3eb0adbe7cbdfb438d5f494123af3a49f7d64224cf94986f9130af21c8d35537e23a120bbc11
|
data/lib/slim_form_object.rb
CHANGED
@@ -1,171 +1,7 @@
|
|
1
1
|
require "slim_form_object/version"
|
2
2
|
require "slim_form_object/helpers"
|
3
|
+
require "slim_form_object/processing"
|
3
4
|
|
4
5
|
module SlimFormObject
|
5
6
|
|
6
|
-
def self.included(base)
|
7
|
-
base.include ActiveModel::Model
|
8
|
-
base.include HelperMethods
|
9
|
-
base.extend ClassMethods
|
10
|
-
base.extend HelperMethods
|
11
|
-
end
|
12
|
-
|
13
|
-
module ClassMethods
|
14
|
-
|
15
|
-
def init_models(*args)
|
16
|
-
self.instance_eval do
|
17
|
-
define_method(:array_of_models) { args }
|
18
|
-
end
|
19
|
-
add_attributes(args)
|
20
|
-
end
|
21
|
-
|
22
|
-
def add_attributes(models)
|
23
|
-
#attr_accessor for models and env params
|
24
|
-
attr_accessor :params
|
25
|
-
models.each{ |model| attr_accessor snake(model.to_s).to_sym }
|
26
|
-
|
27
|
-
#delegate attributes of models
|
28
|
-
models.each do |model|
|
29
|
-
model.column_names.each do |attr|
|
30
|
-
delegate attr.to_sym, "#{attr}=".to_sym,
|
31
|
-
to: snake(model.to_s).to_sym,
|
32
|
-
prefix: snake(model.to_s).to_sym
|
33
|
-
end
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
|
-
def set_model_name(name)
|
38
|
-
@@set_name = name
|
39
|
-
class << self
|
40
|
-
def model_name
|
41
|
-
ActiveModel::Name.new(self, nil, @@set_name.to_s)
|
42
|
-
end
|
43
|
-
end
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
|
-
def submit
|
48
|
-
update_attributes
|
49
|
-
update_attributes_for_collection
|
50
|
-
self
|
51
|
-
end
|
52
|
-
|
53
|
-
alias_method :apply_parameters, :submit
|
54
|
-
|
55
|
-
def save
|
56
|
-
if valid?
|
57
|
-
models = Array.new(array_of_models)
|
58
|
-
while model1 = models.delete( models[0] )
|
59
|
-
array_of_models.each{ |model2| save_models(model1, model2) }
|
60
|
-
end
|
61
|
-
|
62
|
-
return true
|
63
|
-
end
|
64
|
-
false
|
65
|
-
end
|
66
|
-
|
67
|
-
private
|
68
|
-
|
69
|
-
def save_models(model1, model2)
|
70
|
-
self_object_of_model1 = method( snake(model1.to_s) ).call
|
71
|
-
self_object_of_model2 = method( snake(model2.to_s) ).call
|
72
|
-
|
73
|
-
case get_association(model1, model2)
|
74
|
-
when :belongs_to
|
75
|
-
self_object_of_model1.send( "#{snake(model2.to_s)}=", self_object_of_model2 )
|
76
|
-
self_object_of_model1.save!
|
77
|
-
when :has_one
|
78
|
-
self_object_of_model1.send( "#{snake(model2.to_s)}=", self_object_of_model2 )
|
79
|
-
self_object_of_model1.save!
|
80
|
-
when :has_many
|
81
|
-
self_object_of_model1.method("#{model2.table_name}").call << self_object_of_model2
|
82
|
-
self_object_of_model1.save!
|
83
|
-
when :has_and_belongs_to_many
|
84
|
-
self_object_of_model1.method("#{model2.table_name}").call << self_object_of_model2
|
85
|
-
self_object_of_model1.save!
|
86
|
-
end
|
87
|
-
end
|
88
|
-
|
89
|
-
def validation_models
|
90
|
-
array_of_models.each do |model|
|
91
|
-
set_errors( method(snake(model.to_s)).call.errors ) unless method( snake(model.to_s) ).call.valid?
|
92
|
-
end
|
93
|
-
end
|
94
|
-
|
95
|
-
def set_errors(model_errors)
|
96
|
-
model_errors.each do |attribute, message|
|
97
|
-
errors.add(attribute, message)
|
98
|
-
end
|
99
|
-
end
|
100
|
-
|
101
|
-
def update_attributes
|
102
|
-
array_of_models.each do |model|
|
103
|
-
model_attributes = make_attributes_of_model(model)
|
104
|
-
method( snake(model.to_s) ).call.assign_attributes( get_attributes_for_update(model_attributes, model) )
|
105
|
-
end
|
106
|
-
end
|
107
|
-
|
108
|
-
def update_attributes_for_collection
|
109
|
-
array_of_models.each do |model|
|
110
|
-
assign_attributes_for_collection(model)
|
111
|
-
end
|
112
|
-
end
|
113
|
-
|
114
|
-
def keys_of_collections
|
115
|
-
@keys ||= []
|
116
|
-
params.keys.each do |key|
|
117
|
-
array_of_models.each do |model|
|
118
|
-
self_object_of_model = method( snake(model.to_s) ).call
|
119
|
-
method_name = key.to_s[/#{snake(model.to_s)}_(.*)/, 1]
|
120
|
-
@keys << method_name if self_object_of_model.respond_to? method_name.to_s
|
121
|
-
end if key[/^.+_ids$/]
|
122
|
-
end if @keys.empty?
|
123
|
-
@keys
|
124
|
-
end
|
125
|
-
|
126
|
-
def exist_any_arrors_without_collections?
|
127
|
-
keys_of_collections.each do |method_name|
|
128
|
-
array_of_models.each do |model|
|
129
|
-
name_of_model = method_name.to_s[/^(.+)_ids$/, 1]
|
130
|
-
name_of_constant_model = name_of_model.split('_').map(&:capitalize).join
|
131
|
-
name_of_key_error = Object.const_get(name_of_constant_model).table_name
|
132
|
-
errors.messages.delete(name_of_key_error.to_sym)
|
133
|
-
end
|
134
|
-
end unless valid?
|
135
|
-
errors.messages.empty?
|
136
|
-
end
|
137
|
-
|
138
|
-
def assign_attributes_for_collection(model)
|
139
|
-
self_object_of_model = method( snake(model.to_s) ).call
|
140
|
-
|
141
|
-
keys_of_collections.each do |method_name|
|
142
|
-
if self_object_of_model.respond_to? method_name
|
143
|
-
old_attribute = self_object_of_model.method( method_name ).call
|
144
|
-
unless self_object_of_model.update_attributes( {method_name.to_s => params["#{snake(model.to_s)}_#{method_name}".to_sym]} )
|
145
|
-
set_errors(self_object_of_model.errors)
|
146
|
-
self_object_of_model.update_attributes( {method_name.to_s => old_attribute} )
|
147
|
-
end if exist_any_arrors_without_collections?
|
148
|
-
end
|
149
|
-
end
|
150
|
-
end
|
151
|
-
|
152
|
-
def make_attributes_of_model(model)
|
153
|
-
model_attributes = []
|
154
|
-
model.column_names.each do |name|
|
155
|
-
model_attributes << "#{snake(model.to_s)}_#{name}"
|
156
|
-
end
|
157
|
-
model_attributes
|
158
|
-
end
|
159
|
-
|
160
|
-
def get_attributes_for_update(model_attributes, model)
|
161
|
-
update_attributes = {}
|
162
|
-
hash_attributes = params.slice(*model_attributes)
|
163
|
-
hash_attributes.each{ |attr, val| update_attributes[attr.gsub(/#{snake(model.to_s)}_(.*)/, '\1')] = val }
|
164
|
-
update_attributes
|
165
|
-
end
|
166
|
-
|
167
|
-
def get_association(class1, class2)
|
168
|
-
class1.reflections.slice(snake(class2.to_s), class2.table_name).values.first.try(:macro)
|
169
|
-
end
|
170
|
-
|
171
7
|
end
|
@@ -1,5 +1,11 @@
|
|
1
1
|
module HelperMethods
|
2
2
|
def snake(string)
|
3
|
-
string.gsub(/((\w)([A-Z]))/,'\2_\3')
|
3
|
+
string.gsub!(/((\w)([A-Z]))/,'\2_\3')
|
4
|
+
class_name_if_module(string.downcase)
|
5
|
+
end
|
6
|
+
|
7
|
+
def class_name_if_module(string)
|
8
|
+
return $1 if string =~ /^.+::(.+)$/
|
9
|
+
string
|
4
10
|
end
|
5
11
|
end
|
@@ -0,0 +1,163 @@
|
|
1
|
+
module SlimFormObject
|
2
|
+
|
3
|
+
def self.included(base)
|
4
|
+
base.include ActiveModel::Model
|
5
|
+
base.include HelperMethods
|
6
|
+
base.extend ClassMethods
|
7
|
+
base.extend HelperMethods
|
8
|
+
end
|
9
|
+
|
10
|
+
module ClassMethods
|
11
|
+
|
12
|
+
def init_models(*args)
|
13
|
+
self.instance_eval do
|
14
|
+
define_method(:array_of_models) { args }
|
15
|
+
end
|
16
|
+
add_attributes(args)
|
17
|
+
end
|
18
|
+
|
19
|
+
def add_attributes(models)
|
20
|
+
#attr_accessor for models and env params
|
21
|
+
attr_accessor :params
|
22
|
+
models.each{ |model| attr_accessor snake(model.to_s).to_sym }
|
23
|
+
|
24
|
+
#delegate attributes of models
|
25
|
+
models.each do |model|
|
26
|
+
model.column_names.each do |attr|
|
27
|
+
delegate attr.to_sym, "#{attr}=".to_sym,
|
28
|
+
to: snake(model.to_s).to_sym,
|
29
|
+
prefix: snake(model.to_s).to_sym
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def set_model_name(name)
|
35
|
+
define_method(:model_name) { ActiveModel::Name.new(self, nil, name) }
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def submit
|
40
|
+
update_attributes
|
41
|
+
update_attributes_for_collection
|
42
|
+
self
|
43
|
+
end
|
44
|
+
|
45
|
+
alias_method :apply_parameters, :submit
|
46
|
+
|
47
|
+
def save
|
48
|
+
if valid?
|
49
|
+
models = Array.new(array_of_models)
|
50
|
+
while model1 = models.delete( models[0] )
|
51
|
+
array_of_models.each{ |model2| save_models(model1, model2) }
|
52
|
+
end
|
53
|
+
|
54
|
+
return true
|
55
|
+
end
|
56
|
+
false
|
57
|
+
end
|
58
|
+
|
59
|
+
private
|
60
|
+
|
61
|
+
def save_models(model1, model2)
|
62
|
+
self_object_of_model1 = method( snake(model1.to_s) ).call
|
63
|
+
self_object_of_model2 = method( snake(model2.to_s) ).call
|
64
|
+
|
65
|
+
case get_association(model1, model2)
|
66
|
+
when :belongs_to
|
67
|
+
self_object_of_model1.send( "#{snake(model2.to_s)}=", self_object_of_model2 )
|
68
|
+
self_object_of_model1.save!
|
69
|
+
when :has_one
|
70
|
+
self_object_of_model1.send( "#{snake(model2.to_s)}=", self_object_of_model2 )
|
71
|
+
self_object_of_model1.save!
|
72
|
+
when :has_many
|
73
|
+
self_object_of_model1.method("#{model2.table_name}").call << self_object_of_model2
|
74
|
+
self_object_of_model1.save!
|
75
|
+
when :has_and_belongs_to_many
|
76
|
+
self_object_of_model1.method("#{model2.table_name}").call << self_object_of_model2
|
77
|
+
self_object_of_model1.save!
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
def validation_models
|
82
|
+
array_of_models.each do |model|
|
83
|
+
set_errors( method(snake(model.to_s)).call.errors ) unless method( snake(model.to_s) ).call.valid?
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
def set_errors(model_errors)
|
88
|
+
model_errors.each do |attribute, message|
|
89
|
+
errors.add(attribute, message)
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
def update_attributes
|
94
|
+
array_of_models.each do |model|
|
95
|
+
model_attributes = make_attributes_of_model(model)
|
96
|
+
method( snake(model.to_s) ).call.assign_attributes( get_attributes_for_update(model_attributes, model) )
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
def update_attributes_for_collection
|
101
|
+
array_of_models.each do |model|
|
102
|
+
assign_attributes_for_collection(model)
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
def keys_of_collections
|
107
|
+
@keys ||= []
|
108
|
+
params.keys.each do |key|
|
109
|
+
array_of_models.each do |model|
|
110
|
+
self_object_of_model = method( snake(model.to_s) ).call
|
111
|
+
method_name = key.to_s[/#{snake(model.to_s)}_(.*)/, 1]
|
112
|
+
@keys << method_name if self_object_of_model.respond_to? method_name.to_s
|
113
|
+
end if key[/^.+_ids$/]
|
114
|
+
end if @keys.empty?
|
115
|
+
@keys
|
116
|
+
end
|
117
|
+
|
118
|
+
def exist_any_errors_without_collections?
|
119
|
+
keys_of_collections.each do |method_name|
|
120
|
+
array_of_models.each do |model|
|
121
|
+
name_of_model = method_name.to_s[/^(.+)_ids$/, 1]
|
122
|
+
name_of_constant_model = name_of_model.split('_').map(&:capitalize).join
|
123
|
+
name_of_key_error = Object.const_get(name_of_constant_model).table_name
|
124
|
+
errors.messages.delete(name_of_key_error.to_sym)
|
125
|
+
end
|
126
|
+
end unless valid?
|
127
|
+
errors.messages.empty?
|
128
|
+
end
|
129
|
+
|
130
|
+
def assign_attributes_for_collection(model)
|
131
|
+
self_object_of_model = method( snake(model.to_s) ).call
|
132
|
+
|
133
|
+
keys_of_collections.each do |method_name|
|
134
|
+
if self_object_of_model.respond_to? method_name
|
135
|
+
old_attribute = self_object_of_model.method( method_name ).call
|
136
|
+
unless self_object_of_model.update_attributes( {method_name.to_s => params["#{snake(model.to_s)}_#{method_name}".to_sym]} )
|
137
|
+
set_errors(self_object_of_model.errors)
|
138
|
+
self_object_of_model.update_attributes( {method_name.to_s => old_attribute} )
|
139
|
+
end if exist_any_errors_without_collections?
|
140
|
+
end
|
141
|
+
end
|
142
|
+
end
|
143
|
+
|
144
|
+
def make_attributes_of_model(model)
|
145
|
+
model_attributes = []
|
146
|
+
model.column_names.each do |name|
|
147
|
+
model_attributes << "#{snake(model.to_s)}_#{name}"
|
148
|
+
end
|
149
|
+
model_attributes
|
150
|
+
end
|
151
|
+
|
152
|
+
def get_attributes_for_update(model_attributes, model)
|
153
|
+
update_attributes = {}
|
154
|
+
hash_attributes = params.slice(*model_attributes)
|
155
|
+
hash_attributes.each{ |attr, val| update_attributes[attr.gsub(/#{snake(model.to_s)}_(.*)/, '\1')] = val }
|
156
|
+
update_attributes
|
157
|
+
end
|
158
|
+
|
159
|
+
def get_association(class1, class2)
|
160
|
+
class1.reflections.slice(snake(class2.to_s), class2.table_name).values.first.try(:macro)
|
161
|
+
end
|
162
|
+
|
163
|
+
end
|
@@ -239,7 +239,7 @@ describe TestModule do
|
|
239
239
|
end
|
240
240
|
end
|
241
241
|
|
242
|
-
context '
|
242
|
+
context 'exist_any_errors_without_collections?' do
|
243
243
|
before :each do
|
244
244
|
object.instance_eval do
|
245
245
|
def test_one_model
|
@@ -257,7 +257,7 @@ describe TestModule do
|
|
257
257
|
object.stub(:valid?).and_return( false )
|
258
258
|
object.stub_chain(:errors, :messages).and_return( {:test_one_models=>'error', :test_four_models=>'error'} )
|
259
259
|
|
260
|
-
expect(object.send :
|
260
|
+
expect(object.send :exist_any_errors_without_collections?).to eq( true )
|
261
261
|
end
|
262
262
|
|
263
263
|
it 'must be return false' do
|
@@ -271,7 +271,7 @@ describe TestModule do
|
|
271
271
|
object.stub(:valid?).and_return( false )
|
272
272
|
object.stub_chain(:errors, :messages).and_return( {:test_one_models=>'error', :test_four_models=>'error', :descr=>'error'} )
|
273
273
|
|
274
|
-
expect(object.send :
|
274
|
+
expect(object.send :exist_any_errors_without_collections?).to eq( false )
|
275
275
|
end
|
276
276
|
end
|
277
277
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: slim_form_object
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.5.
|
4
|
+
version: 0.5.19
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- woodcrust
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-06-
|
11
|
+
date: 2016-06-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activemodel
|
@@ -136,8 +136,8 @@ dependencies:
|
|
136
136
|
- - ">="
|
137
137
|
- !ruby/object:Gem::Version
|
138
138
|
version: '0'
|
139
|
-
description: Very simple automatic generation and saving of
|
140
|
-
|
139
|
+
description: Very simple automatic generation and saving nested attributes of models
|
140
|
+
from html form. ActiveModel.
|
141
141
|
email:
|
142
142
|
- roboucrop@gmail.com
|
143
143
|
executables:
|
@@ -148,6 +148,7 @@ files:
|
|
148
148
|
- bin/slim_form_object
|
149
149
|
- lib/slim_form_object.rb
|
150
150
|
- lib/slim_form_object/helpers.rb
|
151
|
+
- lib/slim_form_object/processing.rb
|
151
152
|
- lib/slim_form_object/version.rb
|
152
153
|
- spec/db/database.yml
|
153
154
|
- spec/db/database.yml.travis
|