Геокодер Rails «ошибка неопределенного метода»

#ruby-on-rails #ruby #ruby-on-rails-3 #rubygems #google-geocoder

#ruby-on-rails #ruby #ruby-on-rails-3 #rubygems #google-геокодер

Вопрос:

Еще один настоящий новичок в Ruby, поэтому, пожалуйста, будьте осторожны… Я работаю с геокодером alexreisner на rails 3.0 и не могу вызывать методы из библиотеки Geocoder::Results. Я изучил документацию по геокодеру, но не могу выполнить одну простую вещь: извлечь результат «состояния» из адреса, отправленного пользователем. Поэтому превратите «123 Fake Street, San Francisco, CA» в «CA» или «California».

(Пока моя программа будет использовать только информацию о состоянии, чтобы помочь определить результаты, но я хотел бы иметь полную информацию об адресе для использования позже, когда я доработаю приложение, поэтому я запрашиваю полный адрес.)

Я настроил свою модель с помощью лучшего, что я смог собрать из документации и других ответов, которые я нашел здесь, но предыдущие ответы, похожие на эту тему, мне не помогли:

 class Project < ActiveRecord::Base                    
  attr_accessible :title, :address, :latitude, :longitude     

  belongs_to :user 

  geocoded_by :address
  after_validation :fetch_coordinates

  reverse_geocoded_by :latitude, :longitude do |obj, geo| 
    obj.state = geo.state
    obj.country_code = geo.country_code
    obj.address = [geo.state, geo.country_code].join(",")
  end
  after_validation :reverse_geocode  

end
 

Но это приводит к «методу неопределенной ошибки» для состояния, кода страны и адреса. Я не понимаю, потому что документация для Geocoder gem четко предоставляет эти методы. Моя модель, похоже, просто не может получить к ним доступ. (Для справки, моя модель может извлекать широту и долготу из введенного адреса, поэтому кажется, что геокодер настроен правильно. И метод «geocoded_by» отлично работает. Кроме того, он правильно настроен на Google API).

Я почти уверен, что мне здесь чего-то не хватает. В консоли rails я даже могу использовать Geocoder.search («Майами, Флорида») и извлекать всю информацию о округе, штате и городе, но, похоже, я просто не могу извлечь «состояние» с помощью моей модели.

Спасибо за любую помощь!

Ответ №1:

Обязательно перезапустите rails server. Я столкнулся с ситуацией, когда геокодирование отлично работало в консоли rails, но дало мне a undefined method 'geocoded_by' в моем приложении. Похоже, что это не было причиной получения той же ошибки, но она была моей.

Комментарии:

1. Этот ответ помог мне с моей проблемой, потому что код, который я трижды проверил, чтобы убедиться, что он правильный. Спасибо.

Ответ №2:

Если вы посмотрите на примеры на сайте Geocoder, вы увидите, что второе значение, переданное блоку, похоже, является массивом или какой-либо другой формой коллекции, поэтому вы не можете напрямую вызывать методы для него. Вместо этого вам сначала нужно извлечь из него нужный объект:

 reverse_geocoded_by :lat, :lon do |obj,results|
  if geo = results.first
    obj.city    = geo.city
    obj.zipcode = geo.postal_code
    obj.country = geo.country_code
  end
end
 

Комментарии:

1. Используя этот код, я все еще получаю сообщения об ошибках неопределенного метода для «города», «почтового индекса» и «страны». Я не дурачился с документацией Geocoder::Result, поэтому я не знаю, почему они не работают.

2. Только что понял. Мне нужно было использовать мой класс «project» вместо «obj», и я действительно хотел не использовать обратное геокодирование. Спасибо за помощь.