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 模型。
我有一个 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 模型。