1

在Ruby的另一个真正的新手这里,所以请温柔... 我正在与rails3.0的alexreisner的地理编码器,我无法从Geocoder :: Results lib调用方法。我深入了解Geocoder文档,但我无法完成一件简单的事情:从用户提交的地址中提取“状态”结果。因此,将“加利福尼亚州旧金山123街”改为“CA”或“California”。 (我的程序现在只会使用“状态”信息来帮助确定结果,但我希望在完善应用程序后有详细的地址信息供我使用,这就是为什么我要求一个完整的地址。)Rails Geocoder“未定义的方法错误”

我已经建立了我的模型通过最好的我已经能够从文档和其他答案我已经在这里找到,但以前的答案类似于这个问题没有帮助我:

class Project < ActiveRecord::Base      
    attr_accessible :title, :address, :latitude, :longitude  

    belongs_to :user 

    geocoded_by :address 
    after_validation :fetch_coordinates 

    reverse_geocoded_by :latitude, :longitude do |obj, geo| 
    obj.state = geo.state 
    obj.country_code = geo.country_code 
    obj.address = [geo.state, geo.country_code].join(",") 
    end 
    after_validation :reverse_geocode 

end 

但是这会为状态,国家代码和地址形成一个“未定义的错误方法”。我不明白,因为Geocoder gem的文档明确提供了这些方法。我的模型似乎根本无法访问它们。 (为了记录,我的模型能够从输入的地址中提取经度和纬度,所以Geocoder配置正确,并且“geocoded_by”方法效果很好,而且适用于Google API)。

我很确定我在这里错过了一些简单的东西。在rails控制台中,我甚至可以使用Geocoder.search(“Miami,FL”)并且提取所有县,州和城市的信息,但我似乎无法通过我的模型提取“状态”。

感谢您的帮助!

回答

1

如果您查看Geocoder网站上的示例,您会看到第二个赋予该块的值似乎是一个数组或其他某种形式的集合,因此您无法直接调用其上的方法。相反,您首先必须将正确的对象拉出来:

reverse_geocoded_by :lat, :lon do |obj,results| 
    if geo = results.first 
    obj.city = geo.city 
    obj.zipcode = geo.postal_code 
    obj.country = geo.country_code 
    end 
end 
+0

使用该代码,我仍然收到“城市”“邮编”和“国家”未定义的方法错误消息。我没有使用Geocoder :: Result文件,所以我不知道为什么这些不起作用。 –

+0

刚刚得到它。我需要使用我的“项目”类而不是“obj”,并且真的不想使用反向地理编码。感谢您的帮助。 –

6

确保您重新启动rails服务器。我遇到了一种情况,地理编码在rails控制台中运行良好,但在我的应用中给了我一个undefined method 'geocoded_by'。看起来好像这不是你得到同样错误的理由,但它是我的。

+0

这个答案帮助我解决了我的问题,因为我三重检查的代码确保它是正确的。谢谢。 – camdixon

相关问题