lib/geocoder/railtie.rb



require 'geocoder'

module Geocoder
  if defined? Rails::Railtie
    require 'rails'
    class Railtie < Rails::Railtie
      initializer 'geocoder.insert_into_active_record' do
        ActiveSupport.on_load :active_record do
          Geocoder::Railtie.insert
        end
      end
      rake_tasks do
        load "tasks/geocoder.rake"
      end
    end
  end

  class Railtie
    def self.insert
      return unless defined?(::ActiveRecord)
      ::ActiveRecord::Base.extend(ModelMethods)
    end
  end

  ##
  # Methods available in the model class before Geocoder is invoked.
  #
  module ModelMethods

    ##
    # Set attribute names and include the Geocoder module.
    #
    def geocoded_by(address_attr, options = {}, &block)
      geocoder_init(
        :geocode       => true,
        :user_address  => address_attr,
        :latitude      => options[:latitude]  || :latitude,
        :longitude     => options[:longitude] || :longitude,
        :geocode_block => block
      )
    end

    ##
    # Set attribute names and include the Geocoder module.
    #
    def reverse_geocoded_by(latitude_attr, longitude_attr, options = {}, &block)
      geocoder_init(
        :reverse_geocode => true,
        :fetched_address => options[:address] || :address,
        :latitude        => latitude_attr,
        :longitude       => longitude_attr,
        :reverse_block   => block
      )
    end

    def geocoder_options
      @geocoder_options
    end


    private # ----------------------------------------------------------------

    def geocoder_init(options)
      unless geocoder_initialized?
        @geocoder_options = {}
        require 'geocoder/orms/active_record'
        include Geocoder::Orm::ActiveRecord
      end
      @geocoder_options.merge! options
    end

    def geocoder_initialized?
      begin
        included_modules.include? Geocoder::Orm::ActiveRecord
      rescue NameError
        false
      end
    end
  end
end