Rails:使用 Geocoder 的有效地址

Rails: Valid addresses using Geocoder

我有一个 rails 应用程序并且我已经安装了 geocoder gem.

我有 公司 class:

class Company < ActiveRecord::Base
  geocoded_by :address
  validates :address, presence: true
  after_validation :geocode, :if => :address_changed?
end

问题是我希望用户填写公司的完整地址...但是如果用户写类似

Miami, FL, United States

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

我怎样才能做到这一点?

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

address 构建验证,以便您可以决定是否调用 :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 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

我不是在这里写表单代码,我相信你知道如何构建它。另外,一个 Address 可能有不同数量的属性给你,这只是一个建议。此外,在长 运行 中,您应该考虑将 Address 变成一级公民,并为此创建一个单独的 AR 模型。