То, что вы определяете, является не проблемой 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
в гражданина первого уровня и иметь для этого отдельную модель дополненной реальности.
person
dgilperez
schedule
03.03.2015