class Hc::Validators::ClassValidator

Allows for ActiveRecord validation of class types

Public Instance Methods

error(record, attribute) click to toggle source
# File lib/hc/validators/class.rb, line 23
def error(record, attribute)
  record.errors.add(attribute, options[:message] || generate_message)
end
generate_message() click to toggle source
# File lib/hc/validators/class.rb, line 27
def generate_message
  if options[:is_a]
    "must be a #{options[:is_a]}"
  elsif options[:in]
    "must be one of: #{options[:in]}"
  elsif options[:array_of]
    "must be an array of #{options[:array_of]}"
  else
    :invalid
  end
end
validate_each(record, attribute = nil, value = nil) click to toggle source
# File lib/hc/validators/class.rb, line 10
def validate_each(record, attribute = nil, value = nil)
  options = default_options.merge(self.options)
  if options[:is_a]
    validate_one(options, record, attribute, value)
  elsif options[:in]
    validate_in(options, record, attribute, value)
  elsif options[:array_of]
    validate_array(options, record, attribute, value)
  else
    raise 'Invalid validation options'
  end
end

Private Instance Methods

default_options() click to toggle source
# File lib/hc/validators/class.rb, line 41
def default_options
  { is_a: nil, in: nil, array_of: nil, size: nil, cast: nil }
end
validate_array(options, record, attribute, value) click to toggle source
# File lib/hc/validators/class.rb, line 57
def validate_array(options, record, attribute, value)
  unless value.is_a?(Array)
    error(record, attribute)
    return
  end

  if options[:size].to_i.positive?
    unless value.count == options[:size]
      error(record, attribute)
      return
    end
  end

  passed = true
  value.each do |item|
    passed = false unless item.is_a?(options[:array_of])
  end
  error(record, attribute) unless passed
end
validate_in(options, record, attribute, value) click to toggle source
# File lib/hc/validators/class.rb, line 49
def validate_in(options, record, attribute, value)
  passed = false
  options[:in].each do |klass|
    passed = true if value.is_a?(klass)
  end
  error(record, attribute) unless passed
end
validate_one(options, record, attribute, value) click to toggle source
# File lib/hc/validators/class.rb, line 45
def validate_one(options, record, attribute, value)
  error(record, attribute) unless value.is_a?(options[:is_a])
end