-
-
Save yushine/79c2a8c908f1de0bdd3d to your computer and use it in GitHub Desktop.
This file contains hidden or 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 hidden or 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