validation_hints 0.0.7 → 0.1.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.
- data/README.md +33 -3
- data/lib/active_model/hints.rb +22 -21
- data/lib/validation_hints/version.rb +1 -1
- metadata +1 -1
data/README.md
CHANGED
@@ -1,4 +1,34 @@
|
|
1
|
-
validation_hints
|
2
|
-
================
|
3
1
|
|
4
|
-
|
2
|
+
## Validation Hints
|
3
|
+
|
4
|
+
Delivers hints derived from the validation on a model.
|
5
|
+
|
6
|
+
### Install
|
7
|
+
|
8
|
+
```ruby
|
9
|
+
gem 'validation_hints'
|
10
|
+
```
|
11
|
+
|
12
|
+
### Example
|
13
|
+
|
14
|
+
```ruby
|
15
|
+
class Person < ActiveRecord::Base
|
16
|
+
validates :name, :presence => true
|
17
|
+
validates :password, :length => { :within => 1...5 }
|
18
|
+
end
|
19
|
+
```
|
20
|
+
|
21
|
+
```ruby
|
22
|
+
Person.new.hints[:name] => ["can't be blank"]
|
23
|
+
Person.new.hints[:password] => ["must not be shorter than 1 characters", "must not be longer than 4 characters"]
|
24
|
+
Person.new.hints.messages => {:id=>[], :password=>["must not be shorter than 1 characters", "must not be longer than 4 characters"], :name => ["can't be blank"] }
|
25
|
+
```
|
26
|
+
|
27
|
+
### Disclaimer
|
28
|
+
|
29
|
+
It's work in progress.
|
30
|
+
validation_hints was for the most part derived from activerecord-3.2.3/lib/active_record/errors.rb
|
31
|
+
|
32
|
+
|
33
|
+
|
34
|
+
|
data/lib/active_model/hints.rb
CHANGED
@@ -1,6 +1,10 @@
|
|
1
1
|
module ActiveModel
|
2
2
|
# == Active Model Hints
|
3
3
|
#
|
4
|
+
# p = Person.new
|
5
|
+
# p.hints
|
6
|
+
# p.hints[:name]
|
7
|
+
#
|
4
8
|
# more documentation needed
|
5
9
|
|
6
10
|
class Hints
|
@@ -23,10 +27,27 @@ module ActiveModel
|
|
23
27
|
@base = base
|
24
28
|
@messages = ActiveSupport::OrderedHash.new
|
25
29
|
@base.attributes.keys.each do |a|
|
26
|
-
@messages[a.to_sym] =
|
30
|
+
@messages[a.to_sym] = hints_for(a.to_sym)
|
27
31
|
end
|
28
32
|
end
|
29
33
|
|
34
|
+
def hints_for(attribute)
|
35
|
+
result = Array.new
|
36
|
+
@base.class.validators_on(attribute).map do |v|
|
37
|
+
# check for validators that have no options
|
38
|
+
validator = v.class.to_s.split('::').last.downcase.gsub('validator','')
|
39
|
+
if MESSAGES_FOR_VALIDATORS.include?(validator)
|
40
|
+
result << generate_message(attribute, validator)
|
41
|
+
end
|
42
|
+
v.options.each do |o|
|
43
|
+
if MESSAGES_FOR_OPTIONS.include?(o.first.to_s)
|
44
|
+
result << generate_message(attribute, [ validator, o.first.to_s ].join('.'), { :count => o.last } )
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
result
|
49
|
+
end
|
50
|
+
|
30
51
|
def initialize_dup(other)
|
31
52
|
@messages = other.messages.dup
|
32
53
|
end
|
@@ -242,25 +263,6 @@ module ActiveModel
|
|
242
263
|
})
|
243
264
|
end
|
244
265
|
|
245
|
-
def validation_hints_for(attribute)
|
246
|
-
result = Array.new
|
247
|
-
@base.class.validators_on(attribute).map do |v|
|
248
|
-
# puts "** ** ** ** V " + v.class.to_s.split('::').last.downcase.gsub('validator','')
|
249
|
-
# check for validators that have no options
|
250
|
-
validator = v.class.to_s.split('::').last.downcase.gsub('validator','')
|
251
|
-
if MESSAGES_FOR_VALIDATORS.include?(validator)
|
252
|
-
result << generate_message(attribute, validator)
|
253
|
-
end
|
254
|
-
v.options.each do |o|
|
255
|
-
# puts "** ** ** ** O " + o.inspect
|
256
|
-
if MESSAGES_FOR_OPTIONS.include?(o.first.to_s)
|
257
|
-
result << generate_message(attribute, [ validator, o.first.to_s ].join('.'), { :count => o.last } )
|
258
|
-
end
|
259
|
-
end
|
260
|
-
end
|
261
|
-
result
|
262
|
-
end
|
263
|
-
|
264
266
|
def generate_message(attribute, type, options = {})
|
265
267
|
if @base.class.respond_to?(:i18n_scope)
|
266
268
|
defaults = @base.class.lookup_ancestors.map do |klass|
|
@@ -285,7 +287,6 @@ module ActiveModel
|
|
285
287
|
:model => @base.class.model_name.human,
|
286
288
|
:attribute => @base.class.human_attribute_name(attribute),
|
287
289
|
}.merge(options)
|
288
|
-
# puts "*" + File.basename(__FILE__) + ": " + "ATTR #{attribute}, OPTIONS #{options.inspect} "
|
289
290
|
I18n.translate(key, options)
|
290
291
|
end
|
291
292
|
|