【Railsで】Vanityのセットアップ【A/Bテスト】

### ※2013/04/10に追記
RailsでA/Bテストを導入するならVanityよりもSplitをおすすめします！
[RailsにA/BテストツールのSplitを導入する](http://qiita.com/items/4f0836a858fdf301be18)

- - -

Railsで軽いA/Bテストを実施できるVanityをインストールして動かしてみました。
https://github.com/assaf/vanity

参考にしたブログ。
http://face-do.blogspot.jp/2013/01/vanityrailsab-gemfile-gem-chanko-git.html

## インストール

```ruby:Gemfile
gem 'vanity'
```

`bundle install` して入る。

### Redisをインストール

標準のactive_record経由でsqlite3に書き込ませようとしたら、なかなかうまくできなくて嵌ったのでRedisに変更しました。
Redis入れたら素晴らしくスムーズに動く。

わたくしMacですので、`$ brew install redis` 完了でした。
Macではない方は各々のやり方でインストールすること。

## セットアップ

参考ブログでは `$ rails generate vanity` と `$ rake db:migrate` してますが、ここではRedisを採用しているので不要です。

### vanity.ymlでredisに向ける

config/vanity.ymlを作成してredis向けに設定する。

```yaml:vanity.yml
development:
  adapter: redis
  database: redis://localhost:6379/0
```

このあたりは以下URLを参考に雰囲気で。
http://vanity.labnotes.org/configuring.html

### vanityを適用する

config/environments/developent.rbを変更する（各環境ごとに必要になると思う）。

```ruby:developemt.rb
# 以下を追加
Vanity.playground.collecting = true
```

app/controller/application_controller.rbを変更する。

```ruby:application_controller.rb
class ApplicationController < ActionController::Base
  # 以下を追加
  use_vanity :current_user

  # ... 以下色々続きます
```

current_userでユニークなアクセスかどうかを識別する、らしい。

#### 【余談】嵌った話

Rails初心者なもので、そもそもcurrent_userが何なのかわからず、とりあえず書いてみたら、エラーになった。
バグを回避するため、application_controllerには即席のcurrent_userを追加して事なきをえる。

```ruby:application_controller.rb
class ApplicationController < ActionController::Base
  protect_from_forgery
  use_vanity :current_user
 
protected
  def current_user
    session[:user_id]
  end

end
```

実際に動いているアプリケーション（すでにユーザー管理系があるもの）に追加したときは、上記のようなコードは不要だった。
テストで作った空のRailsには必要でした、という話。たぶん。

## ダッシュボードの設定

app/controller/vanity_controller.rbを追加する。

```ruby:vanity_controller.rb
class VanityController < ApplicationController
  include Vanity::Rails::Dashboard
end
```

ルーティングを設定する。

```ruby:routes.rb
# 以下を追加
match '/vanity(/:action(/:id(.:format)))', :controller=>:vanity
```

localhost:3000でアプリを立ち上げているのであれば、
http://localhost:3000/vanity
でアクセスできる。

## お試しのA/Bテストを追加する

公式のGetting Startedで作成するBlogで試してみよう。

- 投稿フォーム画面へのリンク文言でA/Bテスト
- 実際に投稿フォーム画面が表示されたら記録する

## A/Bテスト用のファイルを用意する

vanityではexperimentsディレクトリ内のファイルを元にテストするので、新しくexperimentsディレクトリを作成すること。

- experiments/post_labels.rb
-- A/Bテスト用の文字列と、どの指標に対応しているか指定する
- experiments/metrics/post.rb
-- 指標用のファイル

experiments/metrics/post.rbを追加する。

```ruby:post.rb
metric "Post" do
  description "おお！おおおおお！！！"
end
```

※イマイチ使い方がわかってない。

experiments/post_labels.rbでA/Bテスト用のデータを入れる。

```ruby:post_labels.rb
ab_test "Post labels" do
  description "投稿画面へのリンクテキストを比較"
  alternatives  '記事を投稿する', 'ブログを投稿する', 'つぶやく'
  metrics :post
end
```

A/Bテストと言いつつ、２パターン以上用意できる。

## 表示に対応するビューとコントローラーに組み込む

まず表示する側に組み込もう。
Getting Startedに則って開発しているとおそらく `app/views/posts/index.html.erb` に投稿画面へのリンクがあるはずだ。
それを以下のようなリンクに変更する。

```erb:index.html.erb
<!-- リンク部分のみ表示 -->
<a href="<%= new_post_path %>"><%= ab_test :post_labels %></a>
``` 

表示を確認してみよう。
同一セッションのユーザーは３パターンのどれかが永続的に表示されているはず。
別のブラウザを開くか、vanity_idというクッキーを削除することで、確率により他の文言も表示される。

次に、測定する側の記述を追加する。
コンバージョン対象のアクションに対応しているコントローラーを見つけて、以下のように一行追加すれば完了。
この例ではフォーム投稿画面の `app/controllers/posts_controller.rb` が該当する。

```ruby:posts_controller.rb
  def new
    @post = Post.new
    # 以下の一行を追加
    track! :post
    
```

これで計測されるようになる。
色んな方法でアクセスしてみた後、ダッシュボードを確認すると反映されているはず。

## 終わりに

今のところ本番に上げてないし、あくまでも開発環境までの話。
ここからさらに問題が起きるかもしれなくて不安。
データベースにはmongoDBも使えるらしい。

RailsもRubyもあまりよく理解していなかったので、一歩進むごとにはまった。
今でもこれが正しいのかさっぱりわからない。

あと長すぎて、途中で文体が変わったことに気付かなかった。