Techioz Blog

Ahoy gem Rails 5.1.3 を使用して位置を追跡できない

概要

Rails 5.1.3 アプリケーションに ahoy gem をインストールしました。訪問とイベントを返していますが、訪問場所の属性は常に country: “Reserved”、region: nil、city: nil、postal_code: nil を返します。これは、Ahoy github の指示に従って実装したものです。私が何を見逃しているのか、あるいは何を間違っているのか、どんな団体でも光を当てることができるでしょうか?これは実稼働環境と開発環境の両方で発生しています。

アプリケーション.js

$(document).ready(function(){
  ahoy.trackAll();
});

Gemfile

gem 'ahoy_matey'

訪問の例:

[2] pry(main)> Visit.last
  Visit Load (0.5ms)  SELECT  "visits".* FROM "visits" ORDER BY "visits"."id" DESC LIMIT $1  [["LIMIT", 1]]
=> #<Visit:0x007fd045e04b48
 id: 2,
 visit_token: "7750594c-7163-46c1-8ec7-18f3069619d0",
 visitor_token: "efdcb332-742a-4de3-971b-c141f24ff0f6",
 ip: "74.174.236.84",
 user_agent: "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36",
 referrer: nil,
 landing_page: "http://my_website.com/users/sign_in",
 user_id: nil,
 referring_domain: nil,
 search_keyword: nil,
 browser: "Chrome",
 os: "Mac OS X",
 device_type: "Desktop",
 screen_height: 800,
 screen_width: 1280,
 country: "Reserved",
 region: nil,
 city: nil,
 postal_code: nil,
 latitude: 0.0,
 longitude: 0.0,
 utm_source: nil,
 utm_medium: nil,
 utm_term: nil,
 utm_content: nil,
 utm_campaign: nil,
 started_at: Wed, 22 Nov 2017 21:10:52 UTC +00:00>

解決策

Ahoy gem は位置情報サービスではなくユーザーのデバイスを追跡するだけなので、問題は Ahoy gem 自体にはありません。位置属性を取得するには、Geocoder と Ahoy を使用できます。

Gemfile

Ahoy ドキュメントに依存関係としてリストされているように、Geocoder を Gemfile に追加します。

gem 'ahoy_matey'
gem 'geocoder'

これは、以下のいずれかの方法で実現できます。

ジオコーディングはバックグラウンド ジョブで実行されるため、Web リクエストの速度が低下することはありません。デフォルトのジョブキューは :ahoy です。 config/initializers/ahoy.rb でジオコーディングとバックグラウンド ジョブ キューを有効にします。

Ahoy.geocode = true

Ahoy.job_queue = :default # Ahoy suggests `:low_priority`

Sidekiq を使用している場合は、ターミナルで次のように入力して、バックグラウンド ジョブ処理ライブラリを開始します。

$ sidekiq

config/initializers/ahoy.rb でジオコーディングを有効にしてジョブ キューを設定する必要はありません。このコードを Ahoy::Visit モデルに追加するだけで、属性を自分で設定できます。

after_validation :update_geolocation_data

private

def update_geolocation_data
  location = Geocoder.search(ip).first

  return if location.blank?

  self.city = location.city
  self.region = location.region
  self.country = location.country
  self.latitude = location.latitude
  self.longitude = location.longitude
end

IP アドレスは、開発環境と運用環境では動作が異なります。開発/テスト環境で Ahoy オブジェクトから、または単純に request.ip を使用して IP アドレスをデバッグすると、127.0.0.1 または ::1 のように見えますが、これは場所を検出するのに有効な IP ではありません。

このコードを config/environments/development.rb に追加します。

class ActionController::Request
  def remote_ip
    # Write any IP address you'd like here.
    "71.212.123.5"
  end
end

サーバーを再起動すると、更新された IP アドレスと位置データが Ahoy オブジェクトに追加されます。

> Ahoy::Visit.last
  Ahoy::Visit Load (4.2ms)  SELECT "ahoy_visits".* FROM "ahoy_visits" ORDER BY "ahoy_visits"."id" DESC LIMIT $1  [["LIMIT", 1]]
=> #<Ahoy::Visit:0x00007fc6a84fa698
 id: 18,
 visit_token: "28ff1d9d-f680-4bfc-8fa9-0235c73a24ff",
 visitor_token: "c7ad1fac-e05f-4008-b2a9-4ac60893d638",
 user_id: 3,
 ip: "71.212.123.5",
 user_agent: "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36",
 referrer: "http://localhost:3000/dashboard",
 referring_domain: "localhost",
 landing_page: "http://localhost:3000/dashboard",
 browser: "Chrome",
 os: "Mac",
 device_type: "Desktop",
 country: "US",
 region: "Washington",
 city: "Seattle",
 latitude: 47.5412,
 longitude: -122.275,
 utm_source: nil,
 utm_medium: nil,
 utm_term: nil,
 utm_content: nil,
 utm_campaign: nil,
 app_version: nil,
 os_version: nil,
 platform: nil
 started_at: Fri, 06 Oct 2023 11:37:49.004724000 UTC +00:00>

上記のように Geocoder Gem を追加し、Ahoy で構成すると、正常に動作します。