Ruby on rails Rails:使用地理编码器的有效地址

Ruby on rails Rails:使用地理编码器的有效地址,ruby-on-rails,ruby,rails-geocoder,Ruby On Rails,Ruby,Rails Geocoder,我有一个rails应用程序,并且安装了地理编码器gem 我有公司课程: class Company < ActiveRecord::Base geocoded_by :address validates :address, presence: true after_validation :geocode, :if => :address_changed? end class公司:地址改变了吗? 结束 问题是我希望用户填写公司的完整地址。。。但是如果用户写了这样的东西

我有一个rails应用程序,并且安装了地理编码器gem

我有公司课程:

class Company < ActiveRecord::Base
  geocoded_by :address
  validates :address, presence: true
  after_validation :geocode, :if => :address_changed?
end
class公司:地址改变了吗?
结束
问题是我希望用户填写公司的完整地址。。。但是如果用户写了这样的东西

迈阿密,佛罗里达州,美国

这是允许的。。。但这是一个问题,因为我想要完整的地址,包括街道和高度


如何实现这一点?

您定义的不是地理编码器问题,而是数据模型问题:您要求用户输入完整地址,因此您的应用程序需要理解并处理该问题。地理编码服务将尝试对您传递的任何字符串进行地理编码,无论查询的分辨率如何

地址
建立验证,以便您可以决定是否调用
:geocode
。我可以看到两种方法,这取决于您是否允许用户存储地址,如
“Miami,FL,United States”
,而不是地理编码,或者您是否希望禁止用户输入部分地址。我会选择后者,你会看到,第一个可以通过很少的修改得到

在任何情况下,考虑到没有标准地址格式(例如,您无法或将发现难以构建
Regex
来测试该格式),您需要分别处理不同的部分,并将所需的属性添加到模型和表单中以存储完整地址

class ExtendAddress < ActiveRecord::Migration
  def change
    add_column :companies, :country, :string
    add_column :companies, :state, :string
    add_column :companies, :city, :string
    add_column :companies, :street, :string
    add_column :companies, :street_number, :string
    add_column :companies, :zipcode, :string

    remove_column :companies, :address # if you have data you want to reuse, you'd need to build a method for that before removing the column
  end
end
class ExtendAddress
在您的模型中,如果您只需要数据库中的完整地址,则可以使用验证:

class Company < ActiveRecord::Base
  validates :street, :street_number, :zipcode, :city, :state, :country, presence: true

  geocoded_by :address
  after_validation :geocode, :if => :address_changed?

  def address
    # or whatever format you prefer
    [street, street_number, zipcode, city, state, country].join(',')
  end
end
class公司:地址改变了吗?
def地址
#或者任何你喜欢的格式
[街道,街道号,邮编,城市,州,国家].加入(',')
结束
结束

我不是在这里写表单代码,我相信你知道如何构建它。另外,一个
地址
可能有不同数量的属性,请将此作为建议。此外,从长远来看,你应该考虑把<代码>地址<代码>变成一个第一级公民,并有一个单独的AR模型。

看起来你有一个产权类,而不是一个公司级……我的坏!我已经修好了,汉克斯,还有最后一件事。。。。在这种情况下,是否可以在表单中只包含一个字段作为地址?因为我在输入中使用谷歌地图自动完成,所以我只需要一个字段表单…看起来是这样的!请看一下google maps autocomplete中的这个运行示例: