RailsのGemパッケージ 「 ahoy 」を用いたアクセス解析 + システム活用
アクセス解析なら基本はGAタグを入れ込めば良い訳ですが、解析した内容に応じて 何らかの判定や分岐を行いたい場合にahoyが利用可能です。
出来る事として - バックエンド側でのVisitorの記録、分析 - フロント側でのイベントの検知
などです。
ahoyを使わなくても出来る作業ですが、rails-adminと合わせて、簡易的に訪問者やイベントのデータを見る事が出来ます。
1 インストール、準備
Rail7以上を対象に進めています。
gem "ahoy_matey"
bundle install
$ bin/rails generate ahoy:install
create config/initializers/ahoy.rb
create app/models/ahoy/visit.rb
create app/models/ahoy/event.rb
create db/migrate/20220305232204_create_ahoy_visits_and_events.rb
bin/rails db:migrate を忘れずに
config/initializers/ahoy.rb
Ahoy.api = true #change true
For Rails 7 / Importmap, add to config/importmap.rb:
Rail7以上の場合に追加 config/importmap.rb
pin "ahoy", to: "ahoy.js"
app/javascript/application.js:
import "ahoy"
これでrails-admin上でも Events Visits を確認することが出来るようになります。
2 イベントを設置してみる。
2-1 サーバー側でイベントを記録
例えば作成したArticlesコントローラーのアクションを計測するには下記のようにします。
app/controllers/articles_controller.rb
after_action :track_action
private
def track_action
ahoy.track "Ran action", request.path_parameters
end
閲覧したページのタイトルを取得
def show
@article = Article.find(params[:id])
ahoy.track "Viewed Article", title: @article.title
# @category_name = @article.category.name
end
全体を監視する場合は app/controllers/application_controller.rb にafter_actionと関数を設置しましょう。
2-2 VISITイベントを元にアクセス解析をする。
下記のようにすればイベントの内容をサーバー側で取得可能です。
@visits = Ahoy::Visit.includes(:events).all
@visits.each do |visit|
# visit.ip
# visit.user_agent
visit.events.each do |event|
# event.name
# event.properties
end
end
3 jsとしてテンプレート側に設置
3-1 直接ボタンイベントに記載する場合。
シンプルにbutton設置
<button class="btn btn-primary" onClick="ahoy.track('check',{data:'トップへ戻るイベント'});location.replace('/')">トップへ</button>
3-2 ページのクリックを継続する
link_to に設定したdatasetを取得してイベントとして記録しています。
テンプレ
<%= link_to "TESTCLIKCLASS", root_path , data: {test: "test click"},class: "btn btn-primary", id: "testclickclass" %>
````
追加するjs
```js
<script>
document.querySelector("#testclickclass").addEventListener("click",function(e){
ahoy.track("buttonclick",e.target.dataset);
});
</script>
4 設定の変更 > 新規訪問の感覚、Bot無視
initializers/ahoy.rb
# 新規訪問の間隔を変えたい
Ahoy.visit_duration = 30.minutes
# ↓はBotを計測する場合、通常は設定しないので、そのままで良し
# Ahoy.track_bots = true
5 活用パターンの構築
トークン番号が発行されますので、トークンの末尾の番号に応じて、A,B データを出力みたいな形が可能です。
コントローラーに記載
# 現在のトークンを取得
@ahoy = ahoy.visit_token
# そのトークンのIDを取得
@checkahoy = Ahoy::Visit.where(visit_token: @ahoy).pluck(:id)
# 過去のトークンIDのイベントを取得
# イベントを1つも踏んでない場合は[]、踏んでる場合は[30,37]などイベントのIDが表示
@event = Ahoy::Event.where(visit: @checkahoy).pluck(:id)
テンプレートに表示して確認してみましょう。
<%= debug @ahoy %>
<%= debug @checkahoy %>
<%= debug @event %>
例えば上記のようにすれば、ahoyで指定されたサイクル(Ahoy.visit_duration = 30.minutes 等)に 初めて、訪れたのか、もしくは複数回訪れてるかなどが検証できます。 それに合わせてデータの集計や表示の出し分けなどが可能になります。