views:

982

answers:

2

I want to extract a user country name from visitors' IP addresses.

I could get the IP address with remote_ip. But what could be the easiest way to get the country name?

It doesn't have to be super accurate. Any ruby library (gem or plugin) to do this?

I want an simple and easy solution for this.

+7  A: 

You can use geoip gem.

environment.rb

config.gem 'geoip'

Download GeoIP.dat.gz from http://www.maxmind.com/app/geolitecountry. unzip the file. The below assumes under #{RAILS_ROOT}/db dir.

@geoip ||= GeoIP.new("#{RAILS_ROOT}/db/GeoIP.dat")    
remote_ip = request.remote_ip 
if remote_ip != "127.0.0.1" #todo: check for other local addresses or set default value
  location_location = @geoip.country(remote_ip)
  if location_location != nil     
    @model.country = location_location[2]
  end
end
Chandra Patni
+1  A: 

The simplest is to use an existing web service for this.

There are plugins that let you do much more, including making your models geolocation-aware (geokit-rails) automatically, but if all you need is a country code for example, simply sending an HTTP Get to http://api.hostip.info/country.php (there are other services but this one does not require an API key) will return it, e.g. :

Net::HTTP.get_response(URI.parse('http://api.hostip.info/country.php'))
=> US


Or polling http://api.hostip.info/ will return a full XML response with city, latitude, longitude, etc.

Be aware that the results you get are not 100% accurate. For example, right now I'm in France but reported as in Germany. This will be the case for pretty much any IP-based service.

JRL