Skip to content

Instantly share code, notes, and snippets.

@natarius
Last active August 29, 2015 14:25
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save natarius/d577f62017d1ab3af842 to your computer and use it in GitHub Desktop.
Save natarius/d577f62017d1ab3af842 to your computer and use it in GitHub Desktop.
class ApplicationController < ActionController::Base
after_filter :store_referrer
protected
def store_referrer
return if referred_from_here? or request.format != 'text/html'
referrer_data = {
:session_id => request.session_options[:id],
:referral_url => request.referer,
:requested_url => request.fullpath,
:user_agent => request.user_agent,
:referrer_id => params[:ref_id],
:user_id => current_user.try(:id)
}
SiteVisit.delay.create!(referrer_data)
end
private
def referred_from_here?
instance_variable_defined?(:@referred_from_here) ? @referred_from_here : begin
@referred_from_here = (URI.parse(request.env['HTTP_REFERER']).host == request.host rescue false)
end
end
end
class SiteVisit
include Mongoid::Document
include Mongoid::Timestamps
field :session_id, :type => String
field :referrer_id, :type => String
field :referral_url, :type => String
field :referral_domain, :type => String
field :referral_domain_with_subdomain, :type => String
field :user_agent, :type => String
field :requested_url, :type => String
field :is_bot, :type => Boolean
belongs_to :user, index: true
index session_id: 1
index referrer_id: 1
before_create :sanitize
before_create :save_referer_domain, :save_is_bot
private
def sanitize
# this quietly replaces non-UTF-8 characters with "?"
self.user_agent = user_agent.try :encode, 'UTF-8', undef: :replace, replace: '?'
end
def save_referer_domain
return if self.referral_url.blank?
url = self.referral_url
url = "http://#{url}" unless URI.parse(url).scheme
parsed_url = URI.parse URI.escape url
self.referral_domain_with_subdomain = parsed_url.host
if parsed_url.host
host = parsed_url.host.downcase
self.referral_domain = host.split('.').last(2).join('.')
end
rescue
# ignore
end
def save_is_bot
if self.user_agent.blank? or self.user_agent.match(/asynchttpclient|alexa|bot|butterfly\/\d.\d|crawl(er|ing)|crowsnest|curl|embedly|eventmachine|facebookexternalhit|feedburner|flipboardproxy|firephp|google web preview|(^java)|LongURL|MetaURI|nagios|(^NING\/\d.\d$)|news\.me|peerindex|pingdom|postrank|(^python)|rockmeltembedservice|(^ruby$)|slurp|spider|viadeo|yahoo!|yandex/i)
self.is_bot = true
else
self.is_bot = false
end
true
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment