代码之家  ›  专栏  ›  技术社区  ›  Darme

geocoder::result::geoip2 country返回nil,即使location.data['country'][名称'][en']不是

  •  1
  • Darme  · 技术社区  · 7 年前

    我不能让阿霍伊和地理编码器一起工作,这个问题与这个阿霍伊有关。 line :

    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')
      }
    )
    

    我错过了什么? 谢谢您!

    1 回复  |  直到 7 年前
        1
  •  1
  •   Darme    7 年前

    好吧,我知道了。像往常一样,问题是我的祖国;—)

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

    所以我只需要弄清楚如何让IP_查找在英语中工作,一切都很好:)

    推荐文章