Geocoder::Result::Geoip2#country 返回 nil 即使 location.data['country']['names']['en'] 不是



我无法让Ahoy使用Geocoder,问题与此Ahoy行有关:

module Ahoy
class GeocodeV2Job < ActiveJob::Base
[...]
if location && location.country.present? # <= but my location.country is never present...

这真的很奇怪,因为从我的控制台上,我得到了这个:

> heroku run rails c
> visit = Ahoy::Visit.last
> location = Geocoder.search(visit.ip).first
=> #<Geocoder::Result::Geoip2:0x00000006e14910 @data=#<MaxMindDB::Result:0x00000006e150b8 @raw={"city"=>{"geoname_id"=>3170918, "names"=>{"de"=>"Piasco", "en"=>"Piasco", "fr"=>"Piasco", "pt-BR"=>"Piasco"}}, "continent"=>{"code"=>"EU", "geoname_id"=>6255148, "names"=>{"de"=>"Europa", "en"=>"Europe", "es"=>"Europa", "fr"=>"Europe", "ja"=>"ヨーロッパ", "pt-BR"=>"Europa", "ru"=>"Европа", "zh-CN"=>"欧洲"}}, "country"=>{"geoname_id"=>3175395, "is_in_european_union"=>true, "iso_code"=>"IT", "names"=>{"de"=>"Italien", "en"=>"Italy", "es"=>"Italia", "fr"=>"Italie", "ja"=>"イタリア共和国", "pt-BR"=>"Itália", "ru"=>"Италия", "zh-CN"=>"意大利"}}, "location"=>{"accuracy_radius"=>50, "latitude"=>44.5611, "longitude"=>7.4442, "time_zone"=>"Europe/Rome"}, "postal"=>{"code"=>"12026"}, "registered_country"=>{"geoname_id"=>3175395, "is_in_european_union"=>true, "iso_code"=>"IT", "names"=>{"de"=>"Italien", "en"=>"Italy", "es"=>"Italia", "fr"=>"Italie", "ja"=>"イタリア共和国", "pt-BR"=>"Itália", "ru"=>"Италия", "zh-CN"=>"意大利"}}, "subdivisions"=>[{"geoname_id"=>3170831, "iso_code"=>"21", "names"=>{"de"=>"Piemont", "en"=>"Piedmont", "es"=>"Piamonte", "fr"=>"Piémont", "ja"=>"ピエモンテ州", "ru"=>"Пьемонт", "zh-CN"=>"皮埃蒙特"}}, {"geoname_id"=>3177699, "iso_code"=>"CN", "names"=>{"en"=>"Provincia di Cuneo", "fr"=>"Coni"}}], "network"=>"85.159.180.0/23"}>, @cache_hit=nil>

所以位置不是零!但随后:

> location.country
=> ""

即使:👀

irb(main):008:0> location.data['country']['names']['en']
=> "Italy"

请注意,location是一个:

> location.class
=> Geocoder::Result::Geoip2

我在骑行:

> Rails.version
=> "4.2.8"
> Ahoy::VERSION
=> "2.2.0"

使用地理编码器1.5.0.

这些是我的初始化程序:

module Ahoy
class Store < Ahoy::DatabaseStore
def track_visit(data)
data[:ip] = request.headers['CF-Connecting-IP'] if request.headers['CF-Connecting-IP'].present? # Because I'm using Cloudflare
super(data)
end
def track_event(data)
data[:properties][:subdomain] = request.subdomain
data[:properties][:domain] = request.domain
super(data)
end
end
end
Ahoy.api = true
Ahoy.geocode = true
Geocoder.configure(
lookup: :location_iq,
api_key: ENV['LOCATION_IQ_ACCESS_TKN'],
language: 'it',
cache: Rails.cache,
ip_lookup: :geoip2,
geoip2: {
file: Rails.root.join('lib', 'geocoder', 'GeoLite2-City.mmdb')
}
)

我错过了什么?非常感谢。

好吧,我想明白了。和往常一样,问题是我的祖国;-)

换句话说。。。在我的地理编码初始化器中,我将'it'设置为默认语言,但嵌入在gem 'maxminddb'中的GeoLite2-City.mmdb数据库不支持意大利语。

所以我只需要想办法让ip_lookup用英语工作,一切都很好:)

最新更新