| Module | Validation::ClassMethods |
| In: |
lib/assistance/validation.rb
|
Validation class methods.
| NUMBER_RE | = | /^\d*\.{0,1}\d+$/ |
| INTEGER_RE | = | /\A[+-]?\d+\Z/ |
Returns true if validations are defined.
# File lib/assistance/validation.rb, line 120
120: def has_validations?
121: !validations.empty?
122: end
# File lib/assistance/validation.rb, line 135
135: def skip_superclass_validations
136: @skip_superclass_validations = true
137: end
Validates the given instance.
# File lib/assistance/validation.rb, line 125
125: def validate(o)
126: if superclass.respond_to?(:validate) && !@skip_superclass_validations
127: superclass.validate(o)
128: end
129: validations.each do |att, procs|
130: v = o.send(att)
131: procs.each {|p| p[o, att, v]}
132: end
133: end
Defines validations by converting a longhand block into a series of shorthand definitions. For example:
class MyClass
include Validation
validates do
length_of :name, :minimum => 6
length_of :password, :minimum => 8
end
end
is equivalent to:
class MyClass
include Validation
validates_length_of :name, :minimum => 6
validates_length_of :password, :minimum => 8
end
# File lib/assistance/validation.rb, line 110
110: def validates(&block)
111: Generator.new(self, &block)
112: end
Validates acceptance of an attribute.
# File lib/assistance/validation.rb, line 151
151: def validates_acceptance_of(*atts)
152: opts = {
153: :message => 'is not accepted',
154: :allow_nil => true,
155: :accept => '1'
156: }.merge!(atts.extract_options!)
157:
158: validates_each(*atts) do |o, a, v|
159: next if (v.nil? && opts[:allow_nil]) || (v.blank? && opts[:allow_blank])
160: o.errors[a] << opts[:message] unless v == opts[:accept]
161: end
162: end
Validates confirmation of an attribute.
# File lib/assistance/validation.rb, line 165
165: def validates_confirmation_of(*atts)
166: opts = {
167: :message => 'is not confirmed',
168: }.merge!(atts.extract_options!)
169:
170: validates_each(*atts) do |o, a, v|
171: next if (v.nil? && opts[:allow_nil]) || (v.blank? && opts[:allow_blank])
172: c = o.send("#{a}_confirmation""#{a}_confirmation")
173: o.errors[a] << opts[:message] unless v == c
174: end
175: end
Adds a validation for each of the given attributes using the supplied block. The block must accept three arguments: instance, attribute and value, e.g.:
validates_each :name, :password do |object, attribute, value|
object.errors[attribute] << 'is not nice' unless value.nice?
end
# File lib/assistance/validation.rb, line 146
146: def validates_each(*atts, &block)
147: atts.each {|a| validations[a] << block}
148: end
Validates the format of an attribute.
# File lib/assistance/validation.rb, line 178
178: def validates_format_of(*atts)
179: opts = {
180: :message => 'is invalid',
181: }.merge!(atts.extract_options!)
182:
183: unless opts[:with].is_a?(Regexp)
184: raise ArgumentError, "A regular expression must be supplied as the :with option of the options hash"
185: end
186:
187: validates_each(*atts) do |o, a, v|
188: next if (v.nil? && opts[:allow_nil]) || (v.blank? && opts[:allow_blank])
189: o.errors[a] << opts[:message] unless v.to_s =~ opts[:with]
190: end
191: end
Validates the length of an attribute.
# File lib/assistance/validation.rb, line 194
194: def validates_length_of(*atts)
195: opts = {
196: :too_long => 'is too long',
197: :too_short => 'is too short',
198: :wrong_length => 'is the wrong length'
199: }.merge!(atts.extract_options!)
200:
201: validates_each(*atts) do |o, a, v|
202: next if (v.nil? && opts[:allow_nil]) || (v.blank? && opts[:allow_blank])
203: if m = opts[:maximum]
204: o.errors[a] << (opts[:message] || opts[:too_long]) unless v && v.size <= m
205: end
206: if m = opts[:minimum]
207: o.errors[a] << (opts[:message] || opts[:too_short]) unless v && v.size >= m
208: end
209: if i = opts[:is]
210: o.errors[a] << (opts[:message] || opts[:wrong_length]) unless v && v.size == i
211: end
212: if w = opts[:within]
213: o.errors[a] << (opts[:message] || opts[:wrong_length]) unless v && w.include?(v.size)
214: end
215: end
216: end
Validates whether an attribute is a number.
# File lib/assistance/validation.rb, line 222
222: def validates_numericality_of(*atts)
223: opts = {
224: :message => 'is not a number',
225: }.merge!(atts.extract_options!)
226:
227: re = opts[:only_integer] ? INTEGER_RE : NUMBER_RE
228:
229: validates_each(*atts) do |o, a, v|
230: next if (v.nil? && opts[:allow_nil]) || (v.blank? && opts[:allow_blank])
231: o.errors[a] << opts[:message] unless v.to_s =~ re
232: end
233: end
Validates the presence of an attribute.
# File lib/assistance/validation.rb, line 236
236: def validates_presence_of(*atts)
237: opts = {
238: :message => 'is not present',
239: }.merge!(atts.extract_options!)
240:
241: validates_each(*atts) do |o, a, v|
242: o.errors[a] << opts[:message] unless v && !v.blank?
243: end
244: end
Returns the validations hash for the class.
# File lib/assistance/validation.rb, line 115
115: def validations
116: @validations ||= Hash.new {|h, k| h[k] = []}
117: end