rectify 0.7.1 → 0.8.0
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/rectify/form.rb +32 -6
- data/lib/rectify/presenter.rb +1 -3
- data/lib/rectify/version.rb +1 -1
- data/readme.md +55 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2d2a653fa353d25d4303b71cddb5858ad2562355
|
4
|
+
data.tar.gz: 783cacad47dd54af9d9adb22afc5399214715443
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7240ab43419d70d321e9000473639e3397752ed5d3dc6b8a589c86af2193b5f17dab94f7f4628f904f174a147f1500104e27f317c9f2ed85ebd408040699e305
|
7
|
+
data.tar.gz: b56649c7dcac2d0fbebd93fe78c1f4757afb93f0db3653d7d9143860bf5e2b3e59941b4da004ad09b328fdaeb5feae77183abb463b7ad2f9274ef7d72cd233cc
|
data/lib/rectify/form.rb
CHANGED
@@ -3,6 +3,8 @@ module Rectify
|
|
3
3
|
include Virtus.model
|
4
4
|
include ActiveModel::Validations
|
5
5
|
|
6
|
+
attr_reader :context
|
7
|
+
|
6
8
|
attribute :id, Integer
|
7
9
|
|
8
10
|
def self.from_params(params, additional_params = {})
|
@@ -102,24 +104,48 @@ module Rectify
|
|
102
104
|
# some processing before validation happens (optional).
|
103
105
|
end
|
104
106
|
|
107
|
+
def with_context(new_context)
|
108
|
+
@context = if new_context.is_a?(Hash)
|
109
|
+
OpenStruct.new(new_context)
|
110
|
+
else
|
111
|
+
new_context
|
112
|
+
end
|
113
|
+
|
114
|
+
attributes_that_respond_to(:with_context)
|
115
|
+
.each { |f| f.with_context(context) }
|
116
|
+
|
117
|
+
array_attributes_that_respond_to(:with_context)
|
118
|
+
.each { |f| f.with_context(context) }
|
119
|
+
|
120
|
+
self
|
121
|
+
end
|
122
|
+
|
105
123
|
private
|
106
124
|
|
107
125
|
def form_attributes_valid?
|
108
|
-
|
109
|
-
.each_value
|
110
|
-
.select { |f| f.respond_to?(:valid?) }
|
126
|
+
attributes_that_respond_to(:valid?)
|
111
127
|
.map(&:valid?)
|
112
128
|
.all?
|
113
129
|
end
|
114
130
|
|
115
131
|
def arrays_attributes_valid?
|
132
|
+
array_attributes_that_respond_to(:valid?)
|
133
|
+
.map(&:valid?)
|
134
|
+
.all?
|
135
|
+
end
|
136
|
+
|
137
|
+
def attributes_that_respond_to(message)
|
138
|
+
attributes
|
139
|
+
.each_value
|
140
|
+
.select { |f| f.respond_to?(message) }
|
141
|
+
end
|
142
|
+
|
143
|
+
def array_attributes_that_respond_to(message)
|
116
144
|
attributes
|
117
145
|
.each_value
|
118
146
|
.select { |a| a.is_a?(Array) }
|
119
147
|
.flatten
|
120
|
-
.select { |f| f.respond_to?(
|
121
|
-
.map(&:valid?)
|
122
|
-
.all?
|
148
|
+
.select { |f| f.respond_to?(message) }
|
123
149
|
end
|
124
150
|
end
|
125
151
|
end
|
data/lib/rectify/presenter.rb
CHANGED
data/lib/rectify/version.rb
CHANGED
data/readme.md
CHANGED
@@ -371,6 +371,61 @@ your form as well as any (deeply) nested form objects and array attributes that
|
|
371
371
|
contain form objects. There is also an `#invalid?` method that returns the
|
372
372
|
opposite of `#valid?`.
|
373
373
|
|
374
|
+
### Deep Context
|
375
|
+
|
376
|
+
It's sometimes useful to have some context within your form objects when performing
|
377
|
+
validations or some other type of data manipulation of the input. For example, you
|
378
|
+
might want to check that the current user owns a particular resource as part of your
|
379
|
+
validations. You could add the current user as an additional contextual option as
|
380
|
+
the example shows above. However, sometimes you need this context to be available
|
381
|
+
at all levels within your form not just at the root form object. You might have nested
|
382
|
+
forms or arrays of form objects and they all might need access to this context. As
|
383
|
+
there is no link up the chain from child to parent forms, we need a way to supply
|
384
|
+
some context and make it available to all child forms.
|
385
|
+
|
386
|
+
You can do that using the `#with_context` method.
|
387
|
+
|
388
|
+
```ruby
|
389
|
+
form = UserForm.from_params(params).with_context(:user => current_user)
|
390
|
+
```
|
391
|
+
|
392
|
+
This allows us to access `#context` in any form, and use the information within
|
393
|
+
it when we perform validations or other work:
|
394
|
+
|
395
|
+
```ruby
|
396
|
+
class PostForm < Rectify::Form
|
397
|
+
attribute :blog_id, Integer
|
398
|
+
attribute :title, String
|
399
|
+
attribute :body, String
|
400
|
+
attribute :tags, Array[TagForm]
|
401
|
+
|
402
|
+
validate :check_blog_ownership
|
403
|
+
|
404
|
+
def check_blog_ownership
|
405
|
+
return if context.user.blogs.exists?(:id => blog_id)
|
406
|
+
|
407
|
+
errors.add(:blog_id, "not owned by this user")
|
408
|
+
end
|
409
|
+
end
|
410
|
+
|
411
|
+
class TagForm < Rectify::Form
|
412
|
+
attribute :name, String
|
413
|
+
attribute :category_id, Integer
|
414
|
+
|
415
|
+
validate :check_category
|
416
|
+
|
417
|
+
def check_category
|
418
|
+
return if context.user.categories.exists?(:id => category_id)
|
419
|
+
|
420
|
+
errors.add(:category_id, "not a category for this user")
|
421
|
+
end
|
422
|
+
end
|
423
|
+
```
|
424
|
+
|
425
|
+
The context is passed to all nested forms within a form object to make it easy
|
426
|
+
to perform all the validations and data conversions you might need from within
|
427
|
+
the form object without having to do this as part of the command.
|
428
|
+
|
374
429
|
### Strong Parameters
|
375
430
|
|
376
431
|
Did you notice in the example above that there was no mention of Strong
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rectify
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.8.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Andy Pike
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-12-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: virtus
|