module Vanity::Rails::Helpers

Introduces ab_test helper (controllers and views). Similar to the generic ab_test method, with the ability to capture content (applicable to views, see examples).

Public Instance Methods

ab_test(name, &block) click to toggle source

This method returns one of the alternative values in the named A/B test.

@example A/B two alternatives for a page

def index
  if ab_test(:new_page) # true/false test
    render action: "new_page"
  else
    render action: "index"
  end
end

@example Similar, alternative value is page name

def index
  render action: ab_test(:new_page)
end

@example A/B test inside ERB template (condition)

<%= if ab_test(:banner) %>100% less complexity!<% end %>

@example A/B test inside ERB template (value)

<%= ab_test(:greeting) %> <%= current_user.name %>

@example A/B test inside ERB template (capture)

<% ab_test :features do |count| %>
  <%= count %> features to choose from!
<% end %>
# File lib/vanity/frameworks/rails.rb, line 223
def ab_test(name, &block)
  current_request = respond_to?(:request) ? self.request : nil
  value = Vanity.ab_test(name, current_request)

  if block
    content = capture(value, &block)
    if defined?(block_called_from_erb?) && block_called_from_erb?(block)
       concat(content)
    else
      content
    end
  else
    value
  end
end
vanity_experiments() click to toggle source

Return a copy of the active experiments on a page

@example Render some info about each active experiment in development mode

<% if Rails.env.development? %>
  <% vanity_experiments.each do |name, alternative| %>
    <span>Participating in <%= name %>, seeing <%= alternative %>:<%= alternative.value %> </span>
  <% end %>
<% end %>

@example Push experiment values into javascript for use there

<% experiments = vanity_experiments %>
<% unless experiments.empty? %>
  <script>
    <% experiments.each do |name, alternative| %>
      myAbTests.<%= name.to_s.camelize(:lower) %> = '<%= alternative.value %>';
    <% end %>
  </script>
<% end %>
# File lib/vanity/frameworks/rails.rb, line 291
def vanity_experiments
  edit_safe_experiments = {}

  Vanity.context.vanity_active_experiments.each do |name, alternative|
    edit_safe_experiments[name] = alternative.clone
  end

  edit_safe_experiments
end
vanity_h(text) click to toggle source
# File lib/vanity/frameworks/rails.rb, line 258
def vanity_h(text)
  h(text)
end
vanity_html_safe(text) click to toggle source
# File lib/vanity/frameworks/rails.rb, line 262
def vanity_html_safe(text)
  if text.respond_to?(:html_safe)
    text.html_safe
  else
    text
  end
end
vanity_js() click to toggle source
# File lib/vanity/frameworks/rails.rb, line 251
def vanity_js
  return if Vanity.context.vanity_active_experiments.nil? || Vanity.context.vanity_active_experiments.empty?
  javascript_tag do
    render :file => Vanity.template("_vanity"), :formats => [:js]
  end
end
vanity_simple_format(text, html_options={}) click to toggle source
# File lib/vanity/frameworks/rails.rb, line 270
def vanity_simple_format(text, html_options={})
  vanity_html_safe(simple_format(text, html_options))
end
vanity_track_url_for(identity, metric, options = {}) click to toggle source

Generate url with the identity of the current user and the metric to track on click

# File lib/vanity/frameworks/rails.rb, line 240
def vanity_track_url_for(identity, metric, options = {})
  options = options.merge(:_identity => identity, :_track => metric)
  url_for(options)
end
vanity_tracking_image(identity, metric, options = {}) click to toggle source

Generate url with the fingerprint for the current Vanity experiment

# File lib/vanity/frameworks/rails.rb, line 246
def vanity_tracking_image(identity, metric, options = {})
  options = options.merge(:controller => :vanity, :action => :image, :_identity => identity, :_track => metric)
  image_tag(url_for(options), :width => "1px", :height => "1px", :alt => "")
end