Last active
August 29, 2015 14:25
-
-
Save natarius/d577f62017d1ab3af842 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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