Module: AbPanel::ControllerAdditions

Extended by:
ActiveSupport::Concern
Defined in:
lib/ab_panel/controller_additions.rb

Instance Method Summary collapse

Instance Method Details

#ab_panel_optionsObject



34
35
36
# File 'lib/ab_panel/controller_additions.rb', line 34

def ab_panel_options
  @ab_panel_options ||= {}
end

#distinct_idObject

This sets a unique id for this user.

You could override this in your ApplicationController to use your own implementation, e.g.:

`current_user.id` for logged in users.


29
30
31
32
# File 'lib/ab_panel/controller_additions.rb', line 29

def distinct_id
  cookies.signed['distinct_id'] ||=
    (0..4).map { |i| i.even? ? ('A'..'Z').to_a[rand(26)] : rand(10) }.join
end

#initialize_ab_panel!(options = {}) ⇒ Object

Initializes AbPanel’s environment.

Typically, this would go in a global before filter.

class ApplicationController < ActionController::Base
  before_filter :initialize_ab_panel!
end

This makes sure an ab_panel session is re-initialized on every request. Experiment conditions and unique user id are preserved in the user’s session.



49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
# File 'lib/ab_panel/controller_additions.rb', line 49

def initialize_ab_panel!(options = {})
  AbPanel.reset!


  AbPanel.conditions =
    if cookies.signed[:ab_panel_conditions]
      JSON.parse(cookies.signed[:ab_panel_conditions])
    else
      nil
    end

  cookies.signed[:ab_panel_conditions] = AbPanel.serialized_conditions
  AbPanel.funnels = Set.new(cookies.signed[:ab_panel_funnels])
  cookies.signed[:ab_panel_funnels] = AbPanel.funnels

  {
    'distinct_id' => distinct_id,
    'rack.session' => request.env['rack.session'],
    'ip' => request.remote_ip
  }.each do |key, value|
    AbPanel.set_env(key, value)
  end
end

#track_action(name, properties = {}) ⇒ Object

Track controller actions visits.

name - The name of the event in Mixpanel. properties - The properties to be associated with the event.

Example:

def show
  track_action '[visits] Course', { :course_id => @course.id }
end

This will track the event with the given name on CoursesController#show with the passed in attributes.



86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
# File 'lib/ab_panel/controller_additions.rb', line 86

def track_action(name, properties = {})
  AbPanel.add_funnel(properties.delete(:funnel))

  options = {
    distinct_id: distinct_id,
    ip:          request.remote_ip,
    time:        Time.now.utc,
  }.merge(properties)

  AbPanel.funnels.each do |funnel|
    options["funnel_#{funnel}"] = true
  end

  AbPanel.experiments.each do |exp|
    options[exp] = AbPanel.conditions.send(exp).condition rescue nil
  end

  options.merge!(ab_panel_options)
  AbPanel.set_env(:properties, options)

  AbPanel.identify(distinct_id)
  AbPanel.track(name, options.merge(ab_panel_options))
end

#track_variable(name, value) ⇒ Object

Track a single variable

Example:

track_variable :name, value


9
10
11
# File 'lib/ab_panel/controller_additions.rb', line 9

def track_variable(name, value)
  ab_panel_options[name.to_sym] = value
end

#track_variables(variables = {}) ⇒ Object

Track multiple variables at once.

Example:

track_variables { foo: 'bar', ping: 'pong'}


17
18
19
20
21
# File 'lib/ab_panel/controller_additions.rb', line 17

def track_variables(variables={})
  variables.each do |key, val|
    track_variable key, val
  end
end