module PhonyRails::Extension::ClassMethods

Constants

PHONY_RAILS_COLLECTION_VALID_KEYS

Public Instance Methods

phony_normalize(*attributes) click to toggle source

Use this method on the class level like:

phony_normalize :phone_number, :fax_number, :default_country_code => 'NL'

It checks your model object for a a country_code attribute (eg. 'NL') to do the normalizing so make sure you've geocoded before calling this method!

# File lib/phony_rails.rb, line 202
def phony_normalize(*attributes)
  options = attributes.last.is_a?(Hash) ? attributes.pop : {}
  options.assert_valid_keys(*PHONY_RAILS_COLLECTION_VALID_KEYS)
  raise ArgumentError, ':as option can not be used on phony_normalize with multiple attribute names! (PhonyRails)' if options[:as].present? && (attributes.size > 1)

  options[:enforce_record_country] = true if options[:enforce_record_country].nil?

  conditional = create_before_validation_conditional_hash(options)

  # Add before validation that saves a normalized version of the phone number
  before_validation conditional do
    set_phony_normalized_numbers(self, attributes, options)
  end
end
phony_normalized_method(*attributes) click to toggle source

Usage:

phony_normalized_method :fax_number, :default_country_code => 'US'

Creates a normalized_fax_number method.

# File lib/phony_rails.rb, line 220
def phony_normalized_method(*attributes)
  main_options = attributes.last.is_a?(Hash) ? attributes.pop : {}
  main_options.assert_valid_keys :country_code, :default_country_code
  attributes.each do |attribute|
    raise(StandardError, "Instance method normalized_#{attribute} already exists on #{name} (PhonyRails)") if method_defined?(:"normalized_#{attribute}")

    define_method :"normalized_#{attribute}" do |*args|
      options = main_options.merge(args.first || {})
      assign_values_for_phony_symbol_options(options)
      raise(ArgumentError, "No attribute/method #{attribute} found on #{self.class.name} (PhonyRails)") unless respond_to?(attribute)

      options[:country_code] ||= country_code if respond_to?(:country_code)
      PhonyRails.normalize_number(send(attribute), options)
    end
  end
end

Private Instance Methods

create_before_validation_conditional_hash(options) click to toggle source

Creates a hash representing a conditional for before_validation This allows conditional normalization Returns something like `{ unless: -> { attribute == 'something' } }` If no if/unless options passed in, returns `{ if: -> { true } }`

# File lib/phony_rails.rb, line 243
def create_before_validation_conditional_hash(options)
  if options[:if].present?
    type = :if
    source = options[:if]
  elsif options[:unless].present?
    type = :unless
    source = options[:unless]
  else
    type = :if
    source = true
  end

  conditional = {}
  conditional[type] = if source.respond_to?(:call)
                        source
                      elsif source.respond_to?(:to_sym)
                        -> { send(source.to_sym) }
                      else
                        -> { source }
                      end
  conditional
end