2009-08-22 6 views
2

これは誰でも行いましたか?私はこの作業をどのように行うことができるのか混乱しています。私は自分のユーザモデルを持っています。GeokitとAuthlogicは、ユーザーを作成するときにユーザーのIPアドレスをジオコーディングします

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を提供するため、保存した後、これを行う必要があります。私は結局それをバックグラウンドプロセスにするつもりだと思っていますが、それまでどのように動作させることができますか?私は今、私はいくつかの任意のIPアドレス「12.12.12.12」を持っている。またgeocode()

の結果を格納うユーザモデル内の位置の列を持っているが、それは実際にcurrent_login_ip

答えて

4

私の現在のプロジェクトの1つとして、あなたがしようとしているものと非常によく似た何かを達成しました。考慮すべき大きな点は、モデルを保存するたびに新しいジオコーディング要求をしたくないということです。新しい地理座標を毎回取得する必要がない場合は、むしろ時間がかかり、非効率です。

また、IPアドレスから取得したジオコーディング結果は非常に不正確です。場合によってはまともな結果が得られることもありますが、多くの場合、近くの別の町にデータセンターの座標が表示されます。地域の正確さを求めている場合、IPジオコーディングの精度は、実行しようとしていることに十分対応できる可能性があります。

これは私は属性が変更されていない場合はジオコーディングをrerequestingないという問題に取り組ん方法です:

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 

+1

素晴らしい!私はこれを今すぐ動作させようとしていますが、これはたくさんの助けになります。特に、loc.successブロックが大いに役立っています。 –

2

はしていないする必要があります私自身geokitを使ったので、コメントできません。しかし、あなたが気づいていなかった場合に備えて、HTML 5対応ブラウザー(Firefox 3.5など)がジオロケーションAPIをサポートしていることについて言及する必要があると考えました。 IPジオコーディングおよびIPジオコーディングヘルパーセクションまで

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

スクロール:

+0

大きなヒントだ、私はいくつかのクライアントを使用して検討していますブラウザがユーザを見つけたら、単にajaxを使ってPOSTを実行するだけです。しかし、その日までは、IPアドレスをジオコードするためにサーバーを使用する必要があります。一口...ブラウザの受け入れの遅いペース(間違って... IE unacceptance) –

+0

2つの異なるアプローチを比較し、Firefox、Safari、Chromeの2つの方法の違いの程度を比較すると面白いだろう。 – timbo

2

は、このサイトをチェックしてください。

「次の例のようにジオコーダを使用して、いつでもIPの位置を取得することができる:」

location = IpGeocoder.geocode('12.215.42.19') 

「場所の緯度、経度、都市を含むGeoLocインスタンスであります州、および国のコードを入力します。また、成功値はtrueです。

GeoLocを入手したら、Userモデルをプルし、long/latカラムを設定して保存してください。

GeoLocドキュメント:http://geokit.rubyforge.org/api/geokit-gem/Geokit/GeoLoc.html

私は何かが足りないのですか?

+1

さて、あなたはそれにスポットを当てました。問題は、私がGeoKitをうまく使っていることです。ユーザがログインした後、正しく私のユーザモデルに保存する方法を考え出すのが苦労しています。 –

関連する問題