Railsでページ毎の閲覧数(PV)を計測したい場合「Impressionist」というgemを使うのが定番のようです。
Google Analyticsで計測したアクセス数をアプリケーションから利用したい場合は、APIを使ってデータを持ってくる必要がありますが、Impressionistを使えばRailsのモデル経由で統計情報に素早くアクセスすることができます。
以下使用方法を説明します。
インストール方法
Gemfileに以下を追加します。
gem 'impressionist'
ターミナルで以下のコマンドを実行します。
bundle install
必要なファイルを作成します。
bundle exec rails g impressionist
migrationを実行します。
rake db:migrate
これで準備は完了です。情報は以下のテーブルに保存されます。
create_table "impressions", force: :cascade do |t| t.string "impressionable_type" t.integer "impressionable_id" t.integer "user_id" t.string "controller_name" t.string "action_name" t.string "view_name" t.string "request_hash" t.string "ip_address" t.string "session_hash" t.text "message" t.text "referrer" t.text "params" t.datetime "created_at", precision: 6, null: false t.datetime "updated_at", precision: 6, null: false t.index ["controller_name", "action_name", "ip_address"], name: "controlleraction_ip_index" t.index ["controller_name", "action_name", "request_hash"], name: "controlleraction_request_index" t.index ["controller_name", "action_name", "session_hash"], name: "controlleraction_session_index" t.index ["impressionable_type", "impressionable_id", "ip_address"], name: "poly_ip_index" t.index ["impressionable_type", "impressionable_id", "params"], name: "poly_params_request_index" t.index ["impressionable_type", "impressionable_id", "request_hash"], name: "poly_request_index" t.index ["impressionable_type", "impressionable_id", "session_hash"], name: "poly_session_index" t.index ["impressionable_type", "message", "impressionable_id"], name: "impressionable_type_message_index" t.index ["user_id"], name: "index_impressions_on_user_id" end
使用方法
計測したいモデルを変更します。例えば本(Book)の情報を閲覧できるRailsアプリケーションの場合、Bookモデルに「is_impressionable」を追加します。
class Book < ApplicationRecord is_impressionable end
本の情報を表示(show)したタイミングでPVをカウントしたい場合、BooksController#showでimpressionistメソッドを呼び出します。
def show impressionist(@book, nil, :unique => [:ip_address]) end
「:unique」のところがポイントで、「:ip_address」だとIPアドレスが同じアクセスを同一だとみなします。セッションで判断する「:session_hash」も指定できるはずですが、ブラウザでいきなりshowを呼び出すと(http://localhost:3000/books/1 を開くと)、「undefined method `cookie_value’ for nil:NilClass」というエラーが表示されたので使うのをやめました。記事執筆時Impressionist v2.0.0ではまだ修正されていないようです。
あとはビューファイルを変更してアクセス数を表示します(表示しなくても良いですが)。
ページビュー: <%= @book.impressionist_count %>
▲閲覧画面でPVを表示した場合。
▲一覧画面でPVを表示した場合。
まとめ
Impressionistを使用すればRailsアプリケーションで簡単にPVを計測できそうです。session_hashの修正は今後に期待です。