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