aform 0.0.3 → 0.0.4
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/aform/errors.rb +2 -1
- data/lib/aform/form.rb +9 -10
- data/lib/aform/model.rb +5 -1
- data/lib/aform/uniqueness_validator.rb +10 -0
- data/lib/aform/version.rb +1 -1
- data/lib/aform.rb +1 -0
- data/test/integration/active_record_test.rb +31 -0
- data/test/model_test.rb +6 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 93ff36848be09d703e47acb5b73764f97f235ce5
|
4
|
+
data.tar.gz: bcbac1680a8d4ced2f1bfcaa74170b4ab0ec0052
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f55367787834ae50febed73521daf8a8642a413d91224ed1bdba7924f189fe072d31021603495fa03b99d2e0c6be6abfa5f90442ba8d529edc3cd66d5c630896
|
7
|
+
data.tar.gz: adf3e582fbc4a2fee4d7895af355a6180d044f00bd083dfac303e4c8cc636a986204cbf438061d26a21967483266444e1d66f409fae42d059cfaaf5c65c684f7
|
data/lib/aform/errors.rb
CHANGED
@@ -14,7 +14,8 @@ module Aform
|
|
14
14
|
if nf = form.nested_forms
|
15
15
|
nf.inject({}) do |memo, (k,v)|
|
16
16
|
messages = v.each_with_index.inject({}) do |m, (e, i)|
|
17
|
-
|
17
|
+
errors = e.form_model.errors.messages.merge(nested_messages(e))
|
18
|
+
errors.present? ? m.merge(i => errors) : m
|
18
19
|
end
|
19
20
|
memo.merge(k => messages)
|
20
21
|
end
|
data/lib/aform/form.rb
CHANGED
@@ -1,8 +1,6 @@
|
|
1
1
|
module Aform
|
2
2
|
class Form
|
3
|
-
class_attribute :params
|
4
|
-
class_attribute :validations
|
5
|
-
class_attribute :nested_form_klasses
|
3
|
+
class_attribute :params, :pkey, :validations, :nested_form_klasses
|
6
4
|
|
7
5
|
attr_reader :form_model, :attributes, :nested_forms, :model, :nested_models, :parent
|
8
6
|
|
@@ -41,6 +39,10 @@ module Aform
|
|
41
39
|
end
|
42
40
|
|
43
41
|
class << self
|
42
|
+
def primary_key(key)
|
43
|
+
self.pkey = key
|
44
|
+
end
|
45
|
+
|
44
46
|
def param(*args)
|
45
47
|
self.params ||= []
|
46
48
|
options = args.extract_options!
|
@@ -85,7 +87,7 @@ module Aform
|
|
85
87
|
attributes[k].each do |attrs|
|
86
88
|
@nested_forms ||= {}
|
87
89
|
@nested_forms[k] ||= []
|
88
|
-
model = nested_ar_model(k, attrs)
|
90
|
+
model = nested_ar_model(k, attrs, v.pkey)
|
89
91
|
@nested_forms[k] << v.new(model, attrs, self, @model_klass, @model_builder,
|
90
92
|
@errors_klass, @form_saver, @transaction_klass)
|
91
93
|
end
|
@@ -94,13 +96,10 @@ module Aform
|
|
94
96
|
end
|
95
97
|
end
|
96
98
|
|
97
|
-
def nested_ar_model(association, attrs)
|
99
|
+
def nested_ar_model(association, attrs, key = :id)
|
100
|
+
key = key || :id
|
98
101
|
klass = association.to_s.classify.constantize
|
99
|
-
|
100
|
-
klass.find(attrs[:id])
|
101
|
-
else
|
102
|
-
klass.new
|
103
|
-
end
|
102
|
+
klass.find_by(key => attrs[key]) || klass.new
|
104
103
|
end
|
105
104
|
end
|
106
105
|
end
|
data/lib/aform/model.rb
CHANGED
@@ -14,13 +14,17 @@ class Aform::Model
|
|
14
14
|
ActiveModel::Name.new(self, nil, "Aform::Model")
|
15
15
|
end
|
16
16
|
|
17
|
+
def self.validates_uniqueness_of(*attr_names)
|
18
|
+
validates_with UniquenessValidator, _merge_attributes(attr_names)
|
19
|
+
end
|
20
|
+
|
17
21
|
# AR saves children with parent if it's new object
|
18
22
|
# but dont save children with parent when children is updated
|
19
23
|
def save(association = nil)
|
24
|
+
@object.assign_attributes(@attributes)
|
20
25
|
if @destroy
|
21
26
|
@object.destroy
|
22
27
|
else
|
23
|
-
@object.assign_attributes(@attributes)
|
24
28
|
association << @object if association
|
25
29
|
@object.save
|
26
30
|
end
|
@@ -0,0 +1,10 @@
|
|
1
|
+
require 'active_record'
|
2
|
+
class UniquenessValidator < ::ActiveRecord::Validations::UniquenessValidator
|
3
|
+
def validate_each(form, attribute, value)
|
4
|
+
object = form.instance_variable_get(:@object)
|
5
|
+
@klass = object.class
|
6
|
+
super(object, attribute, value).tap do |res|
|
7
|
+
form.errors.add(attribute, object.errors.first.last) if object.errors.present?
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
data/lib/aform/version.rb
CHANGED
data/lib/aform.rb
CHANGED
@@ -150,4 +150,35 @@ describe "saving" do
|
|
150
150
|
post.author.must_equal("John Doe and Mr. Author")
|
151
151
|
end
|
152
152
|
end
|
153
|
+
|
154
|
+
context "validate uniqueness" do
|
155
|
+
class Other2PostForm < Aform::Form
|
156
|
+
param :title
|
157
|
+
validates :title, uniqueness: true
|
158
|
+
|
159
|
+
has_many :comments do
|
160
|
+
param :message, :author
|
161
|
+
validates_uniqueness_of :message
|
162
|
+
end
|
163
|
+
end
|
164
|
+
|
165
|
+
before do
|
166
|
+
Post.create!(title: "test")
|
167
|
+
Comment.create!(message: "test")
|
168
|
+
end
|
169
|
+
|
170
|
+
after do
|
171
|
+
Post.delete_all
|
172
|
+
Comment.delete_all
|
173
|
+
end
|
174
|
+
|
175
|
+
it "inherits attribute from parent" do
|
176
|
+
post = Post.new
|
177
|
+
attrs = {title: "test", comments: [{message: "test"}]}
|
178
|
+
form = Other2PostForm.new(post, attrs)
|
179
|
+
form.save.must_equal false
|
180
|
+
form.errors.must_equal({:title=>["has already been taken"],
|
181
|
+
:comments=>{0=>{:message=>["has already been taken"]}}})
|
182
|
+
end
|
183
|
+
end
|
153
184
|
end
|
data/test/model_test.rb
CHANGED
@@ -111,11 +111,16 @@ describe Aform::Model do
|
|
111
111
|
end
|
112
112
|
|
113
113
|
context "when marked for destruction" do
|
114
|
-
let(:form_model) { subject.new(ar_model, _destroy: true)}
|
114
|
+
let(:form_model) { subject.new(ar_model, name: "name", count: 2, _destroy: true)}
|
115
115
|
it "removes element" do
|
116
116
|
ar_model.expects(:destroy).returns(true)
|
117
117
|
form_model.nested_save
|
118
118
|
end
|
119
|
+
|
120
|
+
it "calls `ar_model.assign_attributes`" do
|
121
|
+
ar_model.expects(:assign_attributes).with(name: "name", count: 2).returns(true)
|
122
|
+
form_model.nested_save
|
123
|
+
end
|
119
124
|
end
|
120
125
|
end
|
121
126
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: aform
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Anton Versal
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-07-
|
11
|
+
date: 2014-07-21 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -183,6 +183,7 @@ files:
|
|
183
183
|
- lib/aform/form.rb
|
184
184
|
- lib/aform/form_saver.rb
|
185
185
|
- lib/aform/model.rb
|
186
|
+
- lib/aform/uniqueness_validator.rb
|
186
187
|
- lib/aform/version.rb
|
187
188
|
- test/errors_test.rb
|
188
189
|
- test/form_saver_test.rb
|