Sha256: 980281c9f5d62bfea08d710f1e0f471a6a4d9f9f4c51ea6c8506f2097d4de461

Contents?: true

Size: 990 Bytes

Versions: 5

Compression:

Stored size: 990 Bytes

Contents

module ActiveModel
  module Validations
    class PhoneValidator < EachValidator
      def validate_each(record, attribute, value)
        @value = value
        @formats = PhoneValidator.known_formats[options[:country]] || PhoneValidator.known_formats[:us]
        record.errors.add(attribute) if value.blank? || !matches_any?
      end

      def self.known_formats
        @@known_formats ||=
        {:us     => ["###-###-####", "##########", "###.###.####", "### ### ####", "(###) ###-####"],
         :brazil => ["## ####-####", "(##) ####-####", "##########"],
         :france => ["## ## ## ## ##"],
         :uk     => ["#### ### ####"]}
      end

      def matches_any?
        false if @formats.nil? or not @formats.respond_to?(:detect)
        @formats.detect { |format| @value.match(PhoneValidator.regexp_from format) }
      end

      private

      def self.regexp_from(format)
        Regexp.new "^"+(Regexp.escape format).gsub('\#','\d')+"$"
      end

    end
  end
end

Version data entries

5 entries across 5 versions & 1 rubygems

Version Path
activevalidators-1.9.0 lib/active_model/validations/phone_validator.rb
activevalidators-1.8.1 lib/active_model/validations/phone_validator.rb
activevalidators-1.8.0 lib/active_model/validations/phone_validator.rb
activevalidators-1.7.1 lib/active_model/validations/phone_validator.rb
activevalidators-1.7.0 lib/active_model/validations/phone_validator.rb