Geokit и Authlogic, геокодирование IP-адреса пользователей при создании пользователя - PullRequest
2 голосов
/ 22 августа 2009

Кто-нибудь делал это? Я запутался в том, как я могу заставить это работать, во-первых, у меня есть моя пользовательская модель

Геокодирование с ним прекрасно работает в IRB, просто не могу понять, как заставить его работать в моем проекте.

Попытка использовать некоторые примеры из readme здесь: http://github.com/andre/geokit-rails/tree/master.

В любом случае вот что у меня есть:

class User < ActiveRecord::Base

  # geokit
  acts_as_mappable

  after_save :locate

  def locate
    location = Geokit::Geocoders::MultiGeocoder.geocode("12.12.12.12")
  end

end

Это соответствует моему действию сохранения в моем userController, мне нужно сделать это после сохранения, потому что authlogic предоставляет IP-адрес после сохранения пользователя или сеанса. Я думаю, в конце концов, я сделаю это фоновым процессом, но до тех пор, как я могу заставить это работать? У меня есть столбец местоположения в пользовательской модели, в котором я буду хранить результаты geocode()

Также прямо сейчас у меня есть какой-то произвольный IP-адрес "12.12.12.12", но на самом деле это должен быть current_login_ip

Ответы [ 3 ]

4 голосов
/ 23 августа 2009

Для одного из моих текущих проектов я выполнил нечто очень похожее на то, что вы пытаетесь сделать. Важно учитывать, что вы не хотите делать новый запрос геокодирования каждый раз, когда модель сохраняется. Это довольно трудоемкий и неэффективный процесс, если вам не нужно каждый раз получать новые геоординаты.

Кроме того, результаты геокодирования, полученные с IP-адресов, очень неточны. Иногда вы получите приличные результаты, но много раз вы будете получать координаты какого-то дата-центра в другом соседнем городе. Если вы ищете региональную точность, то точность геокодирования IP может быть достаточной для того, что вы пытаетесь сделать.

Вот как я решил проблему с повторным запросом геокодирования, если атрибуты не изменились:

require 'us_states' # this is just an array of states and abbreviations
include Geokit::Geocoders

class Location < ActiveRecord::Base

    acts_as_mappable

    validates_presence_of :name, :address_1, :city, :state, :zip
    validates_format_of :zip, :with => /^([0-9]{5})(-[0-9]{4})?$/
    validates_inclusion_of :state, :in => US_STATES_ABRS

    before_save :get_geo_coords

    # request_geocoding attribute is intended to help with unit testing
    attr_accessor_with_default :request_geocoding, true

    private

    def get_geo_coords
        # if lat and lng are already defined
        if self.lat && self.lng && self.id
            # find existing location
            l = Location.find(self.id)
            # and if location params are the same as existing location
            # then we do not need to request geocords again
            loc_attrs = %w{address_1 address_2 city state zip}
            if loc_attrs.all? {|attr| self.attribute_for_inspect(attr) == l.attribute_for_inspect(attr)}
                self.request_geocoding = false
            end
        end
        if self.request_geocoding
            # Request new geocoding
            loc = MultiGeocoder.geocode("#{self.address_1}, #{self.city}, #{self.state}, #{self.zip}")
            if loc.success
                self.lat = loc.lat
                self.lng = loc.lng
            else
                errors.add_to_base("Unable to geocode your location.  Are you sure your address information is correct?")
            end
        end
    end
end

2 голосов
/ 23 августа 2009

Проверить этот сайт:

http://geokit.rubyforge.org/readme.html

Прокрутите вниз до разделов Помощник по геокодированию и IP-геокодированию.

"Вы можете получить местоположение для IP в любое время, используя геокодер, как в следующем примере:"

location = IpGeocoder.geocode('12.215.42.19')

"где Location - это экземпляр GeoLoc, содержащий широту, долготу, город, штат и код страны. Кроме того, значение успеха равно true."

Как только вы получите GeoLoc, просто потяните модель User, установите столбцы long / lat и сохраните ее.

GeoLoc doc: http://geokit.rubyforge.org/api/geokit-gem/Geokit/GeoLoc.html

Я что-то упустил?

2 голосов
/ 23 августа 2009

Я сам не использовал geokit, поэтому не могу комментировать. Но подумал, что я должен упомянуть, что браузеры, поддерживающие HTML 5 (например, Firefox 3.5), поддерживают API геолокации, если вы не знали об этом.

...