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 で構成すると、正常に動作します。