Moved calculated fields to model
Andrew Kane
committed Feb 27, 2014
commit d23640747e655f263239fc7d14470575ea9cdd37
Showing 5
changed files with
76 additions
and 57 deletions
ahoy_matey.gemspec
+1
-0
| @@ | @@ -21,6 +21,7 @@ Gem::Specification.new do |spec| |
| spec.add_dependency "addressable" | |
| spec.add_dependency "browser", ">= 0.4.0" | |
| spec.add_dependency "geocoder" | |
| + | spec.add_dependency "referer-parser" |
| spec.add_development_dependency "bundler", "~> 1.5" | |
| spec.add_development_dependency "rake" | |
app/controllers/ahoy/visits_controller.rb
+4
-55
| @@ | @@ -14,61 +14,10 @@ module Ahoy |
| v.user = current_user if respond_to?(:current_user) | |
| end | |
| - | referring_uri = Addressable::URI.parse(params[:referrer]) rescue nil |
| - | if referring_uri |
| - | visit.referring_domain = referring_uri.host |
| - | end |
| - | |
| - | landing_uri = Addressable::URI.parse(params[:landing_page]) rescue nil |
| - | if landing_uri |
| - | query_values = landing_uri.query_values || {} |
| - | %w[utm_source utm_medium utm_term utm_content utm_campaign].each do |name| |
| - | visit[name] = query_values[name] |
| - | end |
| - | end |
| - | |
| - | visit.browser = browser.name |
| - | |
| - | # TODO add more |
| - | visit.os = |
| - | if browser.android? |
| - | "Android" |
| - | elsif browser.ios? |
| - | "iOS" |
| - | elsif browser.windows_phone? |
| - | "Windows Phone" |
| - | elsif browser.blackberry? |
| - | "Blackberry" |
| - | elsif browser.chrome_os? |
| - | "Chrome OS" |
| - | elsif browser.mac? |
| - | "Mac" |
| - | elsif browser.windows? |
| - | "Windows" |
| - | elsif browser.linux? |
| - | "Linux" |
| - | end |
| - | |
| - | visit.device_type = |
| - | if browser.tv? |
| - | "TV" |
| - | elsif browser.console? |
| - | "Console" |
| - | elsif browser.tablet? |
| - | "Tablet" |
| - | elsif browser.mobile? |
| - | "Mobile" |
| - | else |
| - | "Desktop" |
| - | end |
| - | |
| - | # location |
| - | location = Geocoder.search(request.remote_ip).first rescue nil |
| - | if location |
| - | visit.country = location.country.presence |
| - | visit.region = location.state.presence |
| - | visit.city = location.city.presence |
| - | end |
| + | visit.set_traffic_source |
| + | visit.set_technology |
| + | visit.set_location |
| + | visit.set_utm_parameters |
| visit.save! | |
| render json: {id: visit.id} | |
app/models/ahoy/visit.rb
+67
-0
| @@ | @@ -1,5 +1,72 @@ |
| module Ahoy | |
| class Visit < ActiveRecord::Base | |
| belongs_to :user, polymorphic: true | |
| + | |
| + | def set_traffic_source |
| + | referring_uri = Addressable::URI.parse(referrer) rescue nil |
| + | if referring_uri |
| + | self.referring_domain = referring_uri.host |
| + | self.search_keyword = (RefererParser::Referer.new(referrer).search_term.to_s.presence rescue nil) |
| + | end |
| + | end |
| + | |
| + | def set_utm_parameters |
| + | landing_uri = Addressable::URI.parse(landing_page) rescue nil |
| + | if landing_uri |
| + | query_values = landing_uri.query_values || {} |
| + | %w[utm_source utm_medium utm_term utm_content utm_campaign].each do |name| |
| + | self[name] = query_values[name] |
| + | end |
| + | end |
| + | end |
| + | |
| + | def set_technology |
| + | browser = Browser.new(ua: user_agent) |
| + | |
| + | self.browser = browser.name |
| + | |
| + | # TODO add more |
| + | self.os = |
| + | if browser.android? |
| + | "Android" |
| + | elsif browser.ios? |
| + | "iOS" |
| + | elsif browser.windows_phone? |
| + | "Windows Phone" |
| + | elsif browser.blackberry? |
| + | "Blackberry" |
| + | elsif browser.chrome_os? |
| + | "Chrome OS" |
| + | elsif browser.mac? |
| + | "Mac" |
| + | elsif browser.windows? |
| + | "Windows" |
| + | elsif browser.linux? |
| + | "Linux" |
| + | end |
| + | |
| + | self.device_type = |
| + | if browser.tv? |
| + | "TV" |
| + | elsif browser.console? |
| + | "Console" |
| + | elsif browser.tablet? |
| + | "Tablet" |
| + | elsif browser.mobile? |
| + | "Mobile" |
| + | else |
| + | "Desktop" |
| + | end |
| + | end |
| + | |
| + | def set_location |
| + | location = Geocoder.search(ip).first rescue nil |
| + | if location |
| + | self.country = location.country.presence |
| + | self.region = location.state.presence |
| + | self.city = location.city.presence |
| + | end |
| + | end |
| + | |
| end | |
| end | |
ahoy_matey.rb b/lib/ahoy_matey.rb
+1
-0
| @@ | @@ -3,6 +3,7 @@ require "ahoy/controller_extensions" |
| require "addressable/uri" | |
| require "browser" | |
| require "geocoder" | |
| + | require "referer-parser" |
| module Ahoy | |
| class Engine < ::Rails::Engine | |
generators/ahoy/templates/install.rb b/lib/generators/ahoy/templates/install.rb
+3
-2
| @@ | @@ -8,15 +8,16 @@ class <%= migration_class_name %> < ActiveRecord::Migration |
| # standard | |
| t.string :ip | |
| t.text :user_agent | |
| + | t.text :referrer |
| + | t.text :landing_page |
| # user | |
| t.integer :user_id | |
| t.string :user_type | |
| # traffic source | |
| - | t.text :referrer |
| t.string :referring_domain | |
| - | t.text :landing_page |
| + | t.string :search_keyword |
| # technology | |
| t.string :browser | |