inincaas/phonelib

View on GitHub
lib/validators/phone_validator.rb

Summary

Maintainability
A
1 hr
Test Coverage
# Validator class for phone validations
#
# ==== Examples
#
# Validates that attribute is a valid phone number.
# If empty value passed for attribute it fails.
#
#   class Phone < ActiveRecord::Base
#     attr_accessible :number
#     validates :number, phone: true
#   end
#
# Validates that attribute is a possible phone number.
# If empty value passed for attribute it fails.
#
#   class Phone < ActiveRecord::Base
#     attr_accessible :number
#     validates :number, phone: { possible: true }
#   end
#
# Validates that attribute is a valid phone number.
# Empty value is allowed to be passed.
#
#   class Phone < ActiveRecord::Base
#     attr_accessible :number
#     validates :number, phone: { allow_blank: true }
#   end
#
# Validates that attribute is a valid phone number of specified type(s).
# It is also possible to check that attribute is a possible number of specified
# type(s). Symbol or array accepted.
#
#   class Phone < ActiveRecord::Base
#     attr_accessible :number, :mobile
#     validates :number, phone: { types: [:mobile, :fixed], allow_blank: true }
#     validates :mobile, phone: { possible: true, types: :mobile  }
#   end
#

class PhoneValidator < ActiveModel::EachValidator
  # Include all core methods
  include Phonelib::Core

  # Validation method
  def validate_each(record, attribute, value)
    return if options[:allow_blank] && value.blank?

    phone = parse(value)
    if options[:types]
      method = options[:possible] ? :possible_types : :types
      valid = (phone.send(method) & types).size > 0
    else
      method = options[:possible] ? :possible? : :valid?
      valid = phone.send(method)
    end

    record.errors.add(attribute, options[:message] || :invalid) unless valid
  end

  private

  def types
    types = options[:types].is_a?(Array) ? options[:types] : [options[:types]]
    types.map &:to_sym
  end

end