ahoy_matey 0.1.1 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +13 -0
- data/README.md +70 -38
- data/lib/ahoy/model.rb +8 -1
- data/lib/ahoy/version.rb +1 -1
- data/lib/ahoy_matey.rb +6 -2
- data/lib/generators/ahoy/templates/install.rb +1 -1
- data/vendor/assets/javascripts/ahoy.js +10 -5
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e8ac2f7e33c48f8b761a8ffee2ae5cd715e52849
|
4
|
+
data.tar.gz: 7d069547085fb036b792492826c7a1fb81363367
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 301bf689ed83f0f44a5c13cc4c1a53707e7ee5fbf7fe53936d560224a647c6d379be3c67834f15d5ec855d0f80081bd37dd4c6db4b9ab573c5ce3661902fb91c
|
7
|
+
data.tar.gz: 3a3016d19a6f00750362bcd9a36992cb04b673bc77832c752cd4ea1fdc065e4faff8f06c38dbb628a9c078c291a0989cc15140966465a453708a572b42d4a31f
|
data/CHANGELOG.md
ADDED
data/README.md
CHANGED
@@ -6,10 +6,10 @@ Visits are stored in **your database** so you can easily combine them with other
|
|
6
6
|
|
7
7
|
You get:
|
8
8
|
|
9
|
-
- traffic source - referrer, referring domain, landing page, search keyword
|
10
|
-
- location - country, region, and city
|
11
|
-
- technology - browser, OS, and device type
|
12
|
-
- utm parameters - source, medium, term, content, campaign
|
9
|
+
- **traffic source** - referrer, referring domain, landing page, search keyword
|
10
|
+
- **location** - country, region, and city
|
11
|
+
- **technology** - browser, OS, and device type
|
12
|
+
- **utm parameters** - source, medium, term, content, campaign
|
13
13
|
|
14
14
|
See which campaigns generate the most revenue effortlessly.
|
15
15
|
|
@@ -17,30 +17,6 @@ See which campaigns generate the most revenue effortlessly.
|
|
17
17
|
Order.joins(:visit).group("utm_campaign").sum(:revenue)
|
18
18
|
```
|
19
19
|
|
20
|
-
Goes great with services like [Google Analytics](http://www.google.com/analytics/)
|
21
|
-
|
22
|
-
## Ready, Set, Go
|
23
|
-
|
24
|
-
Add this line to your application’s Gemfile:
|
25
|
-
|
26
|
-
```ruby
|
27
|
-
gem 'ahoy_matey'
|
28
|
-
```
|
29
|
-
|
30
|
-
And run the generator. This creates a model to store visits.
|
31
|
-
|
32
|
-
```sh
|
33
|
-
rails generate ahoy:install
|
34
|
-
rake db:migrate
|
35
|
-
```
|
36
|
-
|
37
|
-
Lastly, include the javascript file in `app/assets/javascripts/application.js` after jQuery.
|
38
|
-
|
39
|
-
```javascript
|
40
|
-
//= require jquery
|
41
|
-
//= require ahoy
|
42
|
-
```
|
43
|
-
|
44
20
|
## How It Works
|
45
21
|
|
46
22
|
When someone visits your website, Ahoy creates a visit with lots of useful information.
|
@@ -61,7 +37,7 @@ Visit.group(:referring_domain).count
|
|
61
37
|
<%= line_chart Visit.group_by_day(:created_at).count %>
|
62
38
|
```
|
63
39
|
|
64
|
-
|
40
|
+
### The Power
|
65
41
|
|
66
42
|
This information is great on its own, but super powerful when combined with other models.
|
67
43
|
|
@@ -77,7 +53,7 @@ When a visitor places an order, the `visit_id` column is automatically set.
|
|
77
53
|
|
78
54
|
:tada: Magic!
|
79
55
|
|
80
|
-
|
56
|
+
See where orders are coming from with simple joins:
|
81
57
|
|
82
58
|
```ruby
|
83
59
|
Order.joins(:visit).group("referring_domain").count
|
@@ -85,12 +61,21 @@ Order.joins(:visit).group("city").count
|
|
85
61
|
Order.joins(:visit).group("device_type").count
|
86
62
|
```
|
87
63
|
|
88
|
-
|
64
|
+
### Users
|
89
65
|
|
90
66
|
Ahoy automatically attaches the `current_user` to the `current_visit`.
|
91
67
|
|
92
68
|
With [Devise](https://github.com/plataformatec/devise), it will attach the user even if he / she signs in after the visit starts.
|
93
69
|
|
70
|
+
With other authentication frameworks, add this to the end of your sign in method:
|
71
|
+
|
72
|
+
```ruby
|
73
|
+
if current_visit
|
74
|
+
current_visit.user ||= current_user
|
75
|
+
current_visit.save!
|
76
|
+
end
|
77
|
+
```
|
78
|
+
|
94
79
|
To see the visits for a given user, create an association:
|
95
80
|
|
96
81
|
```ruby
|
@@ -106,13 +91,9 @@ user = User.first
|
|
106
91
|
user.visits
|
107
92
|
```
|
108
93
|
|
109
|
-
|
110
|
-
|
111
|
-
Ahoy uses [Geocoder](https://github.com/alexreisner/geocoder) for IP-based geocoding.
|
112
|
-
|
113
|
-
## UTM Parameters
|
94
|
+
### UTM Parameters
|
114
95
|
|
115
|
-
Use UTM
|
96
|
+
Use UTM parameters to track campaigns. [This is great for emails and social media](http://www.thunderseo.com/blog/utm-parameters/). Just add them to your links and Ahoy will pick them up.
|
116
97
|
|
117
98
|
```
|
118
99
|
http://datakick.org/?utm_medium=email&utm_campaign=newsletter&utm_source=newsletter-2014-03
|
@@ -124,10 +105,57 @@ or
|
|
124
105
|
http://datakick.org/?utm_medium=twitter&utm_campaign=social&utm_source=tweet123
|
125
106
|
```
|
126
107
|
|
127
|
-
|
108
|
+
### Location
|
109
|
+
|
110
|
+
Ahoy uses [Geocoder](https://github.com/alexreisner/geocoder) for IP-based geocoding.
|
111
|
+
|
112
|
+
### Multiple Subdomains [master]
|
113
|
+
|
114
|
+
To track visits across multiple subdomains, add this to your layout **before** the javascript files.
|
115
|
+
|
116
|
+
```html
|
117
|
+
<script>
|
118
|
+
var Ahoy = {"domain": "yourdomain.com"};
|
119
|
+
</script>
|
120
|
+
```
|
121
|
+
|
122
|
+
### More
|
128
123
|
|
129
124
|
- Excludes bots
|
130
125
|
- Degrades gracefully when cookies are disabled
|
126
|
+
- Don’t need a field? Just remove it from the migration
|
127
|
+
|
128
|
+
## Installation
|
129
|
+
|
130
|
+
Add this line to your application’s Gemfile:
|
131
|
+
|
132
|
+
```ruby
|
133
|
+
gem 'ahoy_matey'
|
134
|
+
```
|
135
|
+
|
136
|
+
And run the generator. This creates a model to store visits.
|
137
|
+
|
138
|
+
```sh
|
139
|
+
rails generate ahoy:install
|
140
|
+
rake db:migrate
|
141
|
+
```
|
142
|
+
|
143
|
+
Lastly, include the javascript file in `app/assets/javascripts/application.js` after jQuery.
|
144
|
+
|
145
|
+
```javascript
|
146
|
+
//= require jquery
|
147
|
+
//= require ahoy
|
148
|
+
```
|
149
|
+
|
150
|
+
We recommend using traditional analytics services like [Google Analytics](http://www.google.com/analytics/) as well.
|
151
|
+
|
152
|
+
## Reference
|
153
|
+
|
154
|
+
Use a different model
|
155
|
+
|
156
|
+
```ruby
|
157
|
+
Ahoy.visit_model = UserVisit
|
158
|
+
```
|
131
159
|
|
132
160
|
## TODO
|
133
161
|
|
@@ -135,6 +163,10 @@ http://datakick.org/?utm_medium=twitter&utm_campaign=social&utm_source=tweet123
|
|
135
163
|
- hook to store additional fields
|
136
164
|
- turn off modules
|
137
165
|
|
166
|
+
## History
|
167
|
+
|
168
|
+
View the [changelog](https://github.com/ankane/ahoy/blob/master/CHANGELOG.md)
|
169
|
+
|
138
170
|
## Contributing
|
139
171
|
|
140
172
|
Everyone is encouraged to help improve this project. Here are a few ways you can help:
|
data/lib/ahoy/model.rb
CHANGED
@@ -75,7 +75,14 @@ module Ahoy
|
|
75
75
|
|
76
76
|
def set_location
|
77
77
|
if respond_to?(:ip) and [:country=, :region=, :city=].any?{|method| respond_to?(method) }
|
78
|
-
location =
|
78
|
+
location =
|
79
|
+
begin
|
80
|
+
Geocoder.search(ip).first
|
81
|
+
rescue => e
|
82
|
+
$stderr.puts e.message
|
83
|
+
nil
|
84
|
+
end
|
85
|
+
|
79
86
|
if location
|
80
87
|
self.country = location.country.presence if respond_to?(:country=)
|
81
88
|
self.region = location.state.presence if respond_to?(:region=)
|
data/lib/ahoy/version.rb
CHANGED
data/lib/ahoy_matey.rb
CHANGED
@@ -11,7 +11,11 @@ require "ahoy/engine"
|
|
11
11
|
module Ahoy
|
12
12
|
|
13
13
|
def self.visit_model
|
14
|
-
::Visit
|
14
|
+
@visit_model || ::Visit
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.visit_model=(visit_model)
|
18
|
+
@visit_model = visit_model
|
15
19
|
end
|
16
20
|
|
17
21
|
# TODO private
|
@@ -26,7 +30,7 @@ ActionController::Base.send :include, Ahoy::Controller
|
|
26
30
|
ActiveRecord::Base.send(:extend, Ahoy::Model) if defined?(ActiveRecord)
|
27
31
|
|
28
32
|
if defined?(Warden)
|
29
|
-
Warden::Manager.
|
33
|
+
Warden::Manager.after_set_user except: :fetch do |user, auth, opts|
|
30
34
|
request = Rack::Request.new(auth.env)
|
31
35
|
if request.cookies["ahoy_visit"]
|
32
36
|
visit = Ahoy.visit_model.where(visit_token: request.cookies["ahoy_visit"]).first
|
@@ -4,9 +4,10 @@
|
|
4
4
|
"use strict";
|
5
5
|
|
6
6
|
var debugMode = false;
|
7
|
-
var
|
7
|
+
var options = window.Ahoy || {};
|
8
8
|
var $ = window.jQuery || window.Zepto || window.$;
|
9
9
|
var visitToken, visitorToken;
|
10
|
+
var visitTtl, visitorTtl;
|
10
11
|
|
11
12
|
if (debugMode) {
|
12
13
|
visitTtl = 0.2;
|
@@ -19,14 +20,18 @@
|
|
19
20
|
// cookies
|
20
21
|
|
21
22
|
// http://www.quirksmode.org/js/cookies.html
|
22
|
-
function setCookie(name, value, ttl) {
|
23
|
+
function setCookie(name, value, ttl, domain) {
|
23
24
|
var expires = "";
|
25
|
+
var cookieDomain = "";
|
24
26
|
if (ttl) {
|
25
27
|
var date = new Date();
|
26
28
|
date.setTime(date.getTime() + (ttl * 60 * 1000));
|
27
29
|
expires = "; expires=" + date.toGMTString();
|
28
30
|
}
|
29
|
-
|
31
|
+
if (domain) {
|
32
|
+
cookieDomain = "; domain=" + domain;
|
33
|
+
}
|
34
|
+
document.cookie = name + "=" + value + expires + cookieDomain + "; path=/";
|
30
35
|
}
|
31
36
|
|
32
37
|
function getCookie(name) {
|
@@ -79,12 +84,12 @@
|
|
79
84
|
} else {
|
80
85
|
if (!visitorToken) {
|
81
86
|
visitorToken = generateToken();
|
82
|
-
setCookie("ahoy_visitor", visitorToken, visitorTtl);
|
87
|
+
setCookie("ahoy_visitor", visitorToken, visitorTtl, options.domain);
|
83
88
|
}
|
84
89
|
|
85
90
|
// always generate a new visit id here
|
86
91
|
visitToken = generateToken();
|
87
|
-
setCookie("ahoy_visit", visitToken, visitTtl);
|
92
|
+
setCookie("ahoy_visit", visitToken, visitTtl, options.domain);
|
88
93
|
|
89
94
|
// make sure cookies are enabled
|
90
95
|
if (getCookie("ahoy_visit")) {
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ahoy_matey
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Andrew Kane
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-04-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: addressable
|
@@ -116,6 +116,7 @@ extensions: []
|
|
116
116
|
extra_rdoc_files: []
|
117
117
|
files:
|
118
118
|
- ".gitignore"
|
119
|
+
- CHANGELOG.md
|
119
120
|
- Gemfile
|
120
121
|
- LICENSE.txt
|
121
122
|
- README.md
|