Rails: действительные адреса с использованием геокодера

У меня есть приложение rails, и я установил гем geocoder.

У меня есть класс company:

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

Проблема в том, что я хочу, чтобы пользователь заполнил полный адрес компании... но если пользователь напишет что-то вроде

Майами, Флорида, США

Это разрешено... но это проблема, потому что мне нужен полный адрес с улицей и высотой.

Как я могу этого добиться?


person ascherman    schedule 03.03.2015    source источник
comment
Похоже, у вас класс собственности, а не класс компании...   -  person NM Pennypacker    schedule 03.03.2015
comment
Виноват! я исправил это   -  person ascherman    schedule 03.03.2015


Ответы (1)


То, что вы определяете, является не проблемой 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
comment
Спасибо, но напоследок.... возможно ли таким образом иметь только одно поле в форме для адреса? Поскольку я использую автозаполнение Google Maps для ввода, мне нужна только одна форма поля... - person ascherman; 04.03.2015
comment
Кажется так! Взгляните на этот работающий пример из автозаполнения карт Google: developers. google.com/maps/documentation/javascript/examples/ - person dgilperez; 04.03.2015