Class: DataMapper::Validate::GenericValidator
- Defined in:
- lib/dm-validations/validators/generic_validator.rb
Overview
All validators extend this base class. Validators must:
-
Implement the initialize method to capture its parameters, also calling super to have this parent class capture the optional, general :if and :unless parameters.
-
Implement the call method, returning true or false. The call method provides the validation logic.
Direct Known Subclasses
AbsentFieldValidator, AcceptanceValidator, ConfirmationValidator, FormatValidator, LengthValidator, MethodValidator, NumericValidator, PrimitiveValidator, RequiredFieldValidator, UniquenessValidator, WithinValidator
Instance Attribute Summary collapse
- #field_name ⇒ Object readonly
- #humanized_field_name ⇒ Object readonly
- #if_clause ⇒ Object
- #options ⇒ Object readonly
- #unless_clause ⇒ Object
Instance Method Summary collapse
-
#==(other) ⇒ Object
Returns true if validators are equal.
-
#add_error(target, message, field_name = :general) ⇒ Object
Add an error message to a target resource.
-
#call(target) ⇒ Boolean
Call the validator.
-
#execute?(target) ⇒ Boolean
Determines if this validator should be run against the target by evaluating the :if and :unless clauses optionally passed while specifying any validator.
-
#initialize(field_name, options = {}) ⇒ GenericValidator
constructor
Construct a validator.
- #inspect ⇒ Object (also: #to_s)
Constructor Details
#initialize(field_name, options = {}) ⇒ GenericValidator
Construct a validator. Capture the :if and :unless clauses when present.
All additional key/value pairs are passed through to the validator that is sub-classing this GenericValidator
31 32 33 34 35 36 37 |
# File 'lib/dm-validations/validators/generic_validator.rb', line 31 def initialize(field_name, = {}) @if_clause = .delete(:if) @unless_clause = .delete(:unless) @field_name, @options = field_name, @humanized_field_name = Extlib::Inflection.humanize(@field_name) end |
Instance Attribute Details
#field_name ⇒ Object (readonly)
18 19 20 |
# File 'lib/dm-validations/validators/generic_validator.rb', line 18 def field_name @field_name end |
#humanized_field_name ⇒ Object (readonly)
18 19 20 |
# File 'lib/dm-validations/validators/generic_validator.rb', line 18 def humanized_field_name @humanized_field_name end |
#if_clause ⇒ Object
17 18 19 |
# File 'lib/dm-validations/validators/generic_validator.rb', line 17 def if_clause @if_clause end |
#options ⇒ Object (readonly)
18 19 20 |
# File 'lib/dm-validations/validators/generic_validator.rb', line 18 def @options end |
#unless_clause ⇒ Object
17 18 19 |
# File 'lib/dm-validations/validators/generic_validator.rb', line 17 def unless_clause @unless_clause end |
Instance Method Details
#==(other) ⇒ Object
Returns true if validators are equal
Note that this intentionally do validate options equality
even though it is hard to imagine a situation when multiple validations will be used on the same field with the same conditions but different options, it happens to be the case every once in a while with inferred validations for strings/text and explicitly given validations with different option (usually as Range vs. max limit for inferred validation)
104 105 106 107 108 109 110 |
# File 'lib/dm-validations/validators/generic_validator.rb', line 104 def ==(other) self.class == other.class && self.field_name == other.field_name && self.if_clause == other.if_clause && self.unless_clause == other.unless_clause && self.instance_variable_get(:@options) == other.instance_variable_get(:@options) end |
#add_error(target, message, field_name = :general) ⇒ Object
Add an error message to a target resource. If the error corresponds to a specific field of the resource, add it to that field, otherwise add it as a :general message.
TODO - should the field_name for a general message be :default???
49 50 51 |
# File 'lib/dm-validations/validators/generic_validator.rb', line 49 def add_error(target, , field_name = :general) target.errors.add(field_name, ) end |
#call(target) ⇒ Boolean
Call the validator. “call” is used so the operation is BoundMethod and Block compatible. This must be implemented in all concrete classes.
59 60 61 |
# File 'lib/dm-validations/validators/generic_validator.rb', line 59 def call(target) raise NotImplementedError, "DataMapper::Validate::GenericValidator::call must be overriden in a subclass" end |
#execute?(target) ⇒ Boolean
Determines if this validator should be run against the target by evaluating the :if and :unless clauses optionally passed while specifying any validator.
69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 |
# File 'lib/dm-validations/validators/generic_validator.rb', line 69 def execute?(target) if unless_clause = self.unless_clause if unless_clause.is_a?(Symbol) return false if target.send(unless_clause) elsif unless_clause.respond_to?(:call) return false if unless_clause.call(target) end end if if_clause = self.if_clause if if_clause.is_a?(Symbol) return target.send(if_clause) elsif if_clause.respond_to?(:call) return if_clause.call(target) end end true end |
#inspect ⇒ Object Also known as: to_s
112 113 114 |
# File 'lib/dm-validations/validators/generic_validator.rb', line 112 def inspect "<##{self.class.name} @field_name='#{@field_name}' @if_clause=#{@if_clause.inspect} @unless_clause=#{@unless_clause.inspect} @options=#{@options.inspect}>" end |