From 1f04dff81983e4058e7d10b496f7011c8c79d8df Mon Sep 17 00:00:00 2001
From: Alex Reisner <alex@alexreisner.com>
Date: Wed, 7 Sep 2011 09:35:31 -0400
Subject: [PATCH] Execute block even if no geocoding results.

This has always been the intended behavior (as shown by the README's
sample code which begins `if results.first`) but it wasn't implemented
properly. Thanks to github.com/nhippenmeyer for pointing it out.
---
 lib/geocoder/stores/active_record.rb | 11 ++++++-----
 lib/geocoder/stores/base.rb          | 19 +++++++++----------
 lib/geocoder/stores/mongo_base.rb    |  9 +++++----
 test/geocoder_test.rb                |  6 ++++++
 test/test_helper.rb                  |  2 ++
 5 files changed, 28 insertions(+), 19 deletions(-)

diff --git a/lib/geocoder/stores/active_record.rb b/lib/geocoder/stores/active_record.rb
index fb0b478b..38871040 100644
--- a/lib/geocoder/stores/active_record.rb
+++ b/lib/geocoder/stores/active_record.rb
@@ -194,12 +194,13 @@ module Geocoder::Store
     #
     def geocode
       do_lookup(false) do |o,rs|
-        r = rs.first
-        unless r.latitude.nil? or r.longitude.nil?
-          o.send :write_attribute, self.class.geocoder_options[:latitude],  r.latitude
-          o.send :write_attribute, self.class.geocoder_options[:longitude], r.longitude
+        if r = rs.first
+          unless r.latitude.nil? or r.longitude.nil?
+            o.send :write_attribute, self.class.geocoder_options[:latitude],  r.latitude
+            o.send :write_attribute, self.class.geocoder_options[:longitude], r.longitude
+          end
+          r.coordinates
         end
-        r.coordinates
       end
     end
 
diff --git a/lib/geocoder/stores/base.rb b/lib/geocoder/stores/base.rb
index 13a0a353..f7726c64 100644
--- a/lib/geocoder/stores/base.rb
+++ b/lib/geocoder/stores/base.rb
@@ -98,18 +98,17 @@ module Geocoder
           return
         end
 
-        if (results = Geocoder.search(query)).size > 0
+        results = Geocoder.search(query)
 
-          # execute custom block, if specified in configuration
-          block_key = reverse ? :reverse_block : :geocode_block
-          if custom_block = options[block_key]
-            custom_block.call(self, results)
+        # execute custom block, if specified in configuration
+        block_key = reverse ? :reverse_block : :geocode_block
+        if custom_block = options[block_key]
+          custom_block.call(self, results)
 
-          # else execute block passed directly to this method,
-          # which generally performs the "auto-assigns"
-          elsif block_given?
-            yield(self, results)
-          end
+        # else execute block passed directly to this method,
+        # which generally performs the "auto-assigns"
+        elsif block_given?
+          yield(self, results)
         end
       end
     end
diff --git a/lib/geocoder/stores/mongo_base.rb b/lib/geocoder/stores/mongo_base.rb
index 9203e214..fa848014 100644
--- a/lib/geocoder/stores/mongo_base.rb
+++ b/lib/geocoder/stores/mongo_base.rb
@@ -56,11 +56,12 @@ module Geocoder::Store
     #
     def geocode
       do_lookup(false) do |o,rs|
-        r = rs.first
-        unless r.coordinates.nil?
-          o.send :write_attribute, self.class.geocoder_options[:coordinates], r.coordinates.reverse
+        if r = rs.first
+          unless r.coordinates.nil?
+            o.send :write_attribute, self.class.geocoder_options[:coordinates], r.coordinates.reverse
+          end
+          r.coordinates
         end
-        r.coordinates
       end
     end
 
diff --git a/test/geocoder_test.rb b/test/geocoder_test.rb
index 2a0b0246..a4d55aa4 100644
--- a/test/geocoder_test.rb
+++ b/test/geocoder_test.rb
@@ -36,6 +36,12 @@ class GeocoderTest < Test::Unit::TestCase
     assert_equal coords, [v.latitude, v.longitude]
   end
 
+  def test_geocode_block_executed_when_no_results
+    v = Event.new("Nowhere", "no results")
+    v.geocode
+    assert_equal "NOT FOUND", v.coords_string
+  end
+
   def test_reverse_geocode_assigns_and_returns_address
     v = Landmark.new(*landmark_params(:msg))
     address = "4 Penn Plaza, New York, NY 10001, USA"
diff --git a/test/test_helper.rb b/test/test_helper.rb
index f491504a..c302f759 100644
--- a/test/test_helper.rb
+++ b/test/test_helper.rb
@@ -180,6 +180,8 @@ class Event < ActiveRecord::Base
   geocoded_by :address do |obj,results|
     if result = results.first
       obj.coords_string = "#{result.latitude},#{result.longitude}"
+    else
+      obj.coords_string = "NOT FOUND"
     end
   end
 
-- 
GitLab