2013-10-07 5 views
2

Я пытаюсь выяснить, где добавить ошибки для проверки на приложение rails 4, которое использует геокодер.Проверка с помощью geocoder gem

Моя модель выглядит следующим образом:

class Tutor < ActiveRecord::Base 
    belongs_to :user  
    validates_presence_of :user_id 

    geocoded_by :address do |obj, results| 
    if geo = results.first 
     obj.latitude = geo.latitude 
     obj.longitude = geo.longitude 
     obj.country = geo.country 
     obj.city = geo.city 
     obj.postalcode = geo.postal_code 
     obj.address = geo.address 
    end 
    end 
    after_validation :geocode, if: :address_changed? 

end 

Я заметил, что if geo = result.first условного только запускается на выполнение, если адрес был найден успешно. Я хочу добавить сообщение об ошибке, если nil возвращается. Я видел, что this stackoverflow thread объясняет, что я должен использовать before_validation вместо after_validation, но я до сих пор не понимаю, куда добавлять ошибки, чтобы мое представление можно было повторно отобразить и ввести действительную геолокацию.

Любые идеи, где я должен размещать эту информацию? Спасибо!

ответ

0

Попробуйте что-то вроде:

class Tutor < ActiveRecord::Base 
    belongs_to :user  

    before_validation :geocode, if: :address_changed? 

    validates :user_id, :address, presence: true 

    geocoded_by :address do |obj, results| 
    if geo = results.first 
     obj.latitude = geo.latitude 
     obj.longitude = geo.longitude 
     obj.country = geo.country 
     obj.city = geo.city 
     obj.postalcode = geo.postal_code 
     obj.address = geo.address 
    else 
     obj.address = nil 
    end 
    end 
end 
+0

Это не работает, потому что, если адрес не был введен в базе данных еще, условие 'проверяет: адрес, наличие: true' всегда будет возвращать ошибку, так как адрес получает генерируется геокодером после него делает запрос API. – DaniG2k

+0

, поэтому геокодирование должно сделать запрос до проверки. Вот почему есть перед этим валидация ... –

1

Вы можете установить в модели как в этом примере ниже, чтобы подтвердить адрес геокодера будет вызываться только один раз, когда адрес изменился. В методе geocoded_by мы устанавливаем явно для записи широту и долготу, чтобы, чем когда адрес не был найден, эти столбцы будут установлены на нуль.

class Company < ActiveRecord::Base 
    geocoded_by :address do |object, results| 
    if results.present? 
    object.latitude = results.first.latitude 
    object.longitude = results.first.longitude 
    else 
    object.latitude = nil 
    object.longitude = nil 
    end 
    end 

    before_validation :geocode, if: :address_changed? 

    validates :address, presence: true 
    validates :found_address_presence 

    def found_address_presence 
    if latitude.blank? || longitude.blank? 
     errors.add(:address, "We couldn't find the address") 
    end 
    end 
end 
Смежные вопросы