X-Git-Url: https://projects.mako.cc/source/selectricity-live/blobdiff_plain/baf9ff0ec39c13f52ee8d4f087641dc5fcc9c53b..fcc68b4dc198b7cb0cf93467d96038b0844675fe:/vendor/plugins/geokit/lib/geo_kit/ip_geocode_lookup.rb diff --git a/vendor/plugins/geokit/lib/geo_kit/ip_geocode_lookup.rb b/vendor/plugins/geokit/lib/geo_kit/ip_geocode_lookup.rb new file mode 100644 index 0000000..f43edf4 --- /dev/null +++ b/vendor/plugins/geokit/lib/geo_kit/ip_geocode_lookup.rb @@ -0,0 +1,46 @@ +require 'yaml' + +module GeoKit + # Contains a class method geocode_ip_address which can be used to enable automatic geocoding + # for request IP addresses. The geocoded information is stored in a cookie and in the + # session to minimize web service calls. The point of the helper is to enable location-based + # websites to have a best-guess for new visitors. + module IpGeocodeLookup + # Mix below class methods into ActionController. + def self.included(base) # :nodoc: + base.extend ClassMethods + end + + # Class method to mix into active record. + module ClassMethods # :nodoc: + def geocode_ip_address(filter_options = {}) + before_filter :store_ip_location + end + end + + private + + # Places the IP address' geocode location into the session if it + # can be found. Otherwise, looks for a geo location cookie and + # uses that value. The last resort is to call the web service to + # get the value. + def store_ip_location + session[:geo_location] ||= retrieve_location_from_cookie_or_service + cookies[:geo_location] = { :value => session[:geo_location].to_yaml, :expires => 30.days.from_now } if session[:geo_location] + end + + # Uses the stored location value from the cookie if it exists. If + # no cookie exists, calls out to the web service to get the location. + def retrieve_location_from_cookie_or_service + return YAML.load(cookies[:geo_location]) if cookies[:geo_location] + location = Geocoders::IpGeocoder.geocode(get_ip_address) + return location.success ? location : nil + end + + # Returns the real ip address, though this could be the localhost ip + # address. No special handling here anymore. + def get_ip_address + request.remote_ip + end + end +end \ No newline at end of file