impressionist のバージョンは1.5.1。rubyは2.2.2でRailsは4.2.1
導入方法
導入方法は公式のReadmeを見れば分かる
- gem 'impressionist'
- rails g impressionist
- rake db:migrate
ちなみにrailsサーバの再起動が必要。
再起動しない場合、測定しようとしているページにアクセスした際に次のようなエラーメッセージが表示される
undefined local variable or method `is_impressionable' for UserController
本題
例えばユーザ詳細でトラッキングしたい
ユーザ詳細のページのビュー数をトラッキングしたいとする。URLは
みたいな感じ。
また、閲覧者が二度も三度もリロードした際にビュー数を測定し直したくない。
そういう時は、まずControllerのshowメソッドを次のようにする
def show
@user = User.find(params[:id])
impressionist(@user, nil, :unique => [:session_hash])
@page_views = @user.impressionist_count
end
Modelはメソッドis_impressionableを呼び出す。ここであh意味不明だが理由は後述
class User < ActiveRecord::Base
is_impressionable
end
あとはテンプレート側で表示したければする(例はerb)
<%= number_with_delimiter(@page_views) %>
なぜModelであるUserにis_impressionableというメソッド呼び出しをする必要があるのかがすぐには分からなかったが、これは閲覧されたユーザを識別するため。
Controllerで呼び出しているimpressionistメソッドの第一引数に渡している@userがそれにあたる。
このis_impressionableメソッド呼び出しを追加しない場合、以下の様なエラーになる。
(例としてUserモデルをUsersControllerのshowメソッドで利用している)
NoMethodError in UsersController#show
undefined method `impressions' for #<User:0x007f9554b91d88>
処理の流れが分かりづらいので例とdbに作成されたimpressionsテーブル抜粋について記載する
動作
- user/1にFireFoxでアクセス
- user/1にFireFoxでもう一度アクセス(:unique => [:session_hash]があるので記録されない)
- user/2にSafariでアクセス
impressionsの内容
impressionable_type | impressionable_id | session_hash |
---|---|---|
User | 1 | e8223db5dacd807d1cb365f7293f94d7e53b714ec15b74a8422a61c053968307 |
User | 2 | a037e680be002ab5b62c9a5b00b18f4c71c4697c03fcc909f276bc630eb3e33e |
また、Controllerで@user.impressionist_countを利用しているがこれもModelでis_impressionableを利用するメリットの一つ。