lib/geocoder/railtie.rb in rails-geocoder-0.9.8 vs lib/geocoder/railtie.rb in rails-geocoder-0.9.9

- old
+ new

@@ -15,54 +15,66 @@ end end class Railtie def self.insert - return unless defined?(::ActiveRecord) + ::ActiveRecord::Base.extend(ModelMethods) + end + end - ## - # Add methods to ActiveRecord::Base so Geocoder is accessible by models. - # - ::ActiveRecord::Base.class_eval do + ## + # Methods available in the model class before Geocoder is invoked. + # + module ModelMethods - ## - # Set attribute names and include the Geocoder module. - # - def self.geocoded_by(address_attr, options = {}) - _geocoder_init( - :user_address => address_attr, - :latitude => options[:latitude] || :latitude, - :longitude => options[:longitude] || :longitude - ) - end + ## + # 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 self.reverse_geocoded_by(latitude_attr, longitude_attr, options = {}) - _geocoder_init( - :fetched_address => options[:address] || :address, - :latitude => latitude_attr, - :longitude => longitude_attr - ) - 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 self._geocoder_init(options) - unless _geocoder_initialized? - class_inheritable_reader :geocoder_options - class_inheritable_hash_writer :geocoder_options - end - self.geocoder_options = options - unless _geocoder_initialized? - include Geocoder::ActiveRecord - end - end + def geocoder_options + @geocoder_options + end - def self._geocoder_initialized? - included_modules.include? Geocoder::ActiveRecord - 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