【问题标题】:Using Geocode Ruby Gem for User Address input使用 Geocode Ruby Gem 输入用户地址
【发布时间】:2012-05-01 01:36:24
【问题描述】:

我使用 Geocode Ruby Gem 将用户输入的 zip/国家/地区转换为格式良好的位置(例如,美国加利福尼亚州洛杉矶)。我还想在未来使用地理编码(以防你想知道为什么我要费这么多麻烦来修饰格式

我将“地址”列迁移到用户数据库中。现在我被地理编码卡住了,不知道是不是因为我没有在数据库中创建位置文件夹,而是使用用户数据库迁移列。

我收到一个路由错误:未定义方法 `geocoded_by' for #

我是新手,所以如果我没有任何意义,我很抱歉。

class Location < ActiveRecord::Base
  attr_accessible :address, :latitude, :longitude

 geocoded_by :full_address
 after_validation :geocode, :if => :address_changed? 
end

这是我的控制器:

def full_address 
  @user = User.find(params[:address])
  Geocode.serach("@user")
end 

将我的 location.rb 更改为以下内容:

class Location < ActiveRecord::Base
extend ::Geocoder::Model::ActiveRecord 

  attr_accessible :address, :latitude, :longitude

  geocoded_by :address_for_geocode 
  reverse_geocoded_by :latitude, :longitude 
end

导致以下错误:

Routing Error

uninitialized constant Location::Geocoder

Try running rake routes for more information on available routes. 

【问题讨论】:

  • 我会说你的 gem 没有加载,你可以启动 Geocoder.search("1 Twins Way, Minneapolis") 例如。尝试注释掉 geocode_by 和下面的行,看看还有什么错误。
  • 我同意,听起来 gem 没有加载。将 bundle install 添加到 Gemfile 后,您运行了吗?
  • 我肯定安装了 gem。但是,你们俩说的都是绝对有道理的。我会进行更新和安装以确保我会遵循@milan 的建议并注释掉 geocode_by 代码作为测试。
  • 我已经确认安装了 Geocoder '1.1.1'。根据@MilanJaric 的建议,我在原始帖子中添加了一些额外的 cmets。
  • 您的控制器中有错字:Geocode.serach("@user")

标签: ruby-on-rails geocoding


【解决方案1】:

很难在评论中提出建议,所以我会在回答中这样做,如果太长请见谅。请不要投反对票,我会在最后删除或编辑它。取决于它是否是真实的答案。

您收到路由错误,因为您不了解要更改什么以及如何更改代码。

第一

class Location < ActiveRecord::Base

  attr_accessible :address, :latitude, :longitude
  # comment this out! => Geocoder.search("New York, NY, USA")
end

在你的控制器方法中,尝试执行

def full_address 
  @user = User.find(params[:address])
  render :text => Geocoder.search("New York, NY, USA").inspect.to_s
end 

您将收到错误(如果您的应用中未加载 gem)或某些结果。

在我们尝试其他任何事情之前先清除它。

再次运行应用程序并为 full_address 控制器操作执行该路由

顺便说一句,您可以在 rails 控制台中尝试所有操作

/path/to/project# rails c

irb> Geocoder.search("New York, NY, USA")

== 更新 ===

尝试在定位模型中包含地理编码器

class Location < ActiveRecord::Base
  extend ::Geocoder::Model::ActiveRecord

  geocoded_by :address_for_geocode
  reverse_geocoded_by :latitude, :longitude
end

我刚刚检查了他们 git 存储库中的源代码,他们没有扩展 ActivRecord::Base 所以你必须手动完成!!!

【讨论】:

  • 它在控制台中工作! @MilanJaric 我按照您的指示进行操作,但看不到它将在哪里输出结果。如果我只留下我的 locations.rb 文件 attr_accessible :address, :latitude, :longitude 并添加控制器方法,我不会收到任何错误。但是,当我重新添加 geocoded_by :full_address 时,我遇到了问题。
  • 我正在查看您有问题的代码,对我来说 geocoded_by 在位置模型中,您正在尝试对用户模型进行地理编码。如果我没记错的话,那个“geocode_by”应该在用户模型中。有意义吗?
  • 对不起,我的文字错误。它实际上在我的位置模型中。我已从您的更新中添加了额外的文本,但仍然遇到同样的问题。
  • 该死的 :: 在 Geocoder 模块名称前面 :) 现在它应该可以工作了,如果不请 require 'geocoder/models/active_record' 以上位置模型
  • 现在我收到 undefined method 'key?' for nil:NilClass 错误
【解决方案2】:

请检查您的控制器

def full_address 
  @user = User.find(params[:address])
  Geocode.serach("@user")
end

应该是

def full_address 
  @user = User.find(params[:address])
  Geocode.search("@user")
end 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多