class CouchRest::Validation::LengthValidator

@author Guy van den Berg @since 0.9

Public Instance Methods

call(target) click to toggle source
# File lib/couchrest/validation/validators/length_validator.rb, line 49
def call(target)
  field_value = target.validation_property_value(field_name)
  return true if @options[:allow_nil] && field_value.nil?

  field_value = '' if field_value.nil?

  # XXX: HACK seems hacky to do this on every validation, probably should
  #      do this elsewhere?
  field = field_name.to_s.humanize
  min = @range ? @range.min : @min
  max = @range ? @range.max : @max
  equal = @equal

  case @validation_method
  when :range then
    unless valid = @range.include?(field_value.size)
      error_message = ValidationErrors.default_error_message(:length_between, field, min, max)
    end
  when :min then
    unless valid = field_value.size >= min
      error_message = ValidationErrors.default_error_message(:too_short, field, min)
    end
  when :max then
    unless valid = field_value.size <= max
      error_message = ValidationErrors.default_error_message(:too_long, field, max)
    end
  when :equals then
    unless valid = field_value.size == equal
      error_message = ValidationErrors.default_error_message(:wrong_length, field, equal)
    end
  end

  error_message = @options[:message] || error_message

  add_error(target, error_message, field_name) unless valid

  return valid
end

Public Class Methods

new(field_name, options) click to toggle source
# File lib/couchrest/validation/validators/length_validator.rb, line 33
def initialize(field_name, options)
  super
  @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