LoginSignup
50
47

More than 5 years have passed since last update.

impressionist gemを使ってrailsでページビューをトラッキングする

Last updated at Posted at 2015-05-18

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を利用するメリットの一つ。

50
47
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
50
47