Class: DataMapper::Validations::LengthValidator

Inherits:
GenericValidator show all
Defined in:
lib/data_mapper/validations/length_validator.rb

Constant Summary collapse

ERROR_MESSAGES =
{
  :range => '#{field} must be between #{min} and #{max} characters long',
  :min => '#{field} must be more than #{min} characters long',
  :max => '#{field} must be less than #{max} characters long',
  :equals => '#{field} must be #{equal} characters long'
}

Instance Method Summary collapse

Methods inherited from GenericValidator

#add_error, #validation_error_message

Constructor Details

#initialize(field_name, options) ⇒ LengthValidator

Returns a new instance of LengthValidator.



13
14
15
16
17
18
19
20
21
22
23
24
25
26
# File 'lib/data_mapper/validations/length_validator.rb', line 13

def initialize(field_name, options)
  @field_name = field_name
  @options = options
  
  @min = options[:minimum] || options[:min]
  @max = options[:maximum] || options[:max]
  @equal = options[:is] || options[:equals]
  @range = options[:within] || options[:in]

  @validation_method ||= :range if @range
  @validation_method ||= :min if @min && @max.nil?
  @validation_method ||= :max if @max && @min.nil?
  @validation_method ||= :equals unless @equal.nil?
end

Instance Method Details

#call(target) ⇒ Object



28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
# File 'lib/data_mapper/validations/length_validator.rb', line 28

def call(target)
  field_value = target.instance_variable_get("@#{@field_name}").to_s
  return true if @options[:allow_nil] && field_value.nil?
  
  # HACK seems hacky to do this on every validation, probably should do this elsewhere?
  field = Inflector.humanize(@field_name)
  min = @range ? @range.min : @min
  max = @range ? @range.max : @max
  equal = @equal

  error_message = validation_error_message(ERROR_MESSAGES[@validation_method], nil, binding)
  
  valid = case @validation_method
  when :range then
    @range.include?(field_value.size)
  when :min then
    field_value.size >= min
  when :max then
    field_value.size <= max
  when :equals then
    field_value.size == equal
  end
  
  add_error(target, error_message, @field_name) unless valid

  return valid
end