class OptimizelyServerSide::Experiment

Public Class Methods

new(experiment_key, selected_variation_key) click to toggle source
# File lib/optimizely_server_side/experiment.rb, line 8
def initialize(experiment_key, selected_variation_key)
  @selected_variation_key = selected_variation_key
  @experiment_key         = experiment_key
  @variations             = []
end

Public Instance Methods

applicable_variation() click to toggle source

Selects and calls the variation which is applicable In case of running test the applicable variation key is present In case of fallback / paused test we pick the primary variation

# File lib/optimizely_server_side/experiment.rb, line 54
def applicable_variation
  ActiveSupport::Notifications.instrument "oss.variation", variation: @selected_variation_key, experiment: @experiment_key, visitor_id: OptimizelyServerSide.configuration.user_attributes['visitor_id'] do
    if @variations.any?(&variation_selector)
      @variations.find(&variation_selector).call
    else
      primary_variation.call if primary_variation
    end
  end
end
method_missing(key, *args, &blk) click to toggle source

Support for variation_three, variation_four till variation_n

Calls superclass method
# File lib/optimizely_server_side/experiment.rb, line 43
def method_missing(key, *args, &blk)
  if key.to_s.match('variation_')
    add_variation(args[0], args[1] || {}, &blk)
  else
    super
  end
end
omniture_tag(evar: nil) click to toggle source

Hidden omniture tag for HTML tracking

# File lib/optimizely_server_side/experiment.rb, line 15
def omniture_tag(evar: nil)
  if @selected_variation_key
    #"<input type='hidden' data-optimizely=#{@experiment_key}:#{@selected_variation_key} data-optimizely-evar=#{evar}></input>".html_safe
    #{}"<input type='hidden' data-optimizely=#{@experiment_key}:#{@selected_variation_key} data-optimizely-evar=#{evar}></input>".html_safe
    key = "#{@experiment_key}:#{@selected_variation_key}"
    %Q(<input type="hidden" name="ab_#{key}" id="ab_id_#{key}" value="" data-optimizely="#{key}" data-optimizely-evar="#{evar}"/>).html_safe
  end
end
primary_variation() click to toggle source

Primary variation is where primary: true

# File lib/optimizely_server_side/experiment.rb, line 65
def primary_variation
  @primary_variation ||= @variations.find(&:primary)
end
start() { |self| ... } click to toggle source

Starts the experiment

# File lib/optimizely_server_side/experiment.rb, line 25
def start
  yield(self)
  self.applicable_variation
end
variation_default(key, opts = {}, &blk) click to toggle source
# File lib/optimizely_server_side/experiment.rb, line 38
def variation_default(key, opts = {}, &blk)
  add_variation(key, opts, &blk)
end
variation_one(key, opts = {}, &blk) click to toggle source
# File lib/optimizely_server_side/experiment.rb, line 30
def variation_one(key, opts = {}, &blk)
  add_variation(key, opts, &blk)
end
variation_two(key, opts = {}, &blk) click to toggle source
# File lib/optimizely_server_side/experiment.rb, line 34
def variation_two(key, opts = {}, &blk)
  add_variation(key, opts, &blk)
end

Private Instance Methods

add_variation(key, opts = {}, &blk) click to toggle source

Add all the variation to the variations collection

# File lib/optimizely_server_side/experiment.rb, line 77
def add_variation(key, opts = {}, &blk)
  Variation.new(
    key: key,
    primary: opts[:primary] || false,
    content: blk
  ).tap do |variation_instance|
    @variations << variation_instance
  end
end
variation_selector() click to toggle source

Scope to query on selected variation

# File lib/optimizely_server_side/experiment.rb, line 72
def variation_selector
  ->(variation) { variation.key == @selected_variation_key }
end