lib/validators/phone_validator.rb in phonelib-0.6.21 vs lib/validators/phone_validator.rb in phonelib-0.6.22

- old
+ new

@@ -34,10 +34,17 @@ # attr_accessible :number, :mobile # validates :number, phone: { types: [:mobile, :fixed], allow_blank: true } # validates :mobile, phone: { possible: true, types: :mobile } # end # +# validates that phone is valid and it is from specified country or countries +# +# class Phone < ActiveRecord::Base +# attr_accessible :number +# validates :number, phone: { countries: [:us, :ca] } +# end +# # Validates that attribute does not include an extension. # The default setting is to allow extensions # # class Phone < ActiveRecord::Base # attr_accessible :number @@ -49,59 +56,70 @@ include Phonelib::Core # Validation method def validate_each(record, attribute, value) return if options[:allow_blank] && value.blank? - allowed_extensions = options.has_key?(:extensions) ? options[:extensions] : true - phone = parse(value, specified_country(record)) - valid = if simple_validation? - phone.send(validate_method) - else - (phone_types(phone) & types).size > 0 - end + @phone = parse(value, specified_country(record)) + valid = phone_valid? && valid_types? && valid_country? && valid_extensions? - # We default to not-allowing extensions for fax numbers - if valid && !allowed_extensions && !phone.extension.empty? - valid = false - end - record.errors.add(attribute, message, options) unless valid end private def message options[:message] || :invalid end - def validate_method - options[:possible] ? :possible? : :valid? + def phone_valid? + @phone.send(options[:possible] ? :possible? : :valid?) end + def valid_types? + return true unless options[:types] + (phone_types & types).size > 0 + end + + def valid_country? + return true unless options[:countries] + (phone_countries & countries).size > 0 + end + + def valid_extensions? + return true if !options.has_key?(:extensions) || options[:extensions] + @phone.extension.empty? + end + def specified_country(record) return unless options[:country_specifier] options[:country_specifier].call(record) end # @private - def simple_validation? - options[:types].nil? - end - - # @private - # @param phone [Phonelib::Phone] parsed phone - def phone_types(phone) + def phone_types method = options[:possible] ? :possible_types : :types - phone_types = phone.send(method) + phone_types = @phone.send(method) if (phone_types & [Phonelib::Core::FIXED_OR_MOBILE]).size > 0 phone_types += [Phonelib::Core::FIXED_LINE, Phonelib::Core::MOBILE] end phone_types end # @private + def phone_countries + method = options[:possible] ? :countries : :valid_countries + @phone.send(method) + end + + # @private def types types = options[:types].is_a?(Array) ? options[:types] : [options[:types]] types.map(&:to_sym) + end + + # @private + def countries + countries = options[:countries].is_a?(Array) ? options[:countries] : [options[:countries]] + countries.map { |c| c.to_s.upcase } end end