【问题标题】:ERROR -- : Caught an error during Google geocoding call: SSL_connect SYSCALL returned=5 errno=0 state=SSLv2/v3 read server hello A错误 - :在 Google 地理编码调用期间遇到错误:SSL_connect SYSCALL returned=5 errno=0 state=SSLv2/v3 read server hello A
【发布时间】:2016-11-15 22:10:42
【问题描述】:

在我的模型中输入坐标时,我试图获取地址。

 def full_address
    Geocoder.address("#{self.latlon.x}, #{self.latlon.y}")
  end

但是,有时它可以正常工作,然后有时我会收到此错误。我已经到处寻找解决方案,但没有一个适用于我。

warning: constant Geokit::Geocoders::Geocoder::TimeoutError is deprecated
E, [2016-11-15T17:06:32.828481 #7406] ERROR -- : Caught an error during Google geocoding call: SSL_connect SYSCALL returned=5 errno=0 state=SSLv2/v3 read server hello A
E, [2016-11-15T17:06:32.828665 #7406] ERROR -- : /Users/Brandon/.rvm/rubies/ruby-2.3.1/lib/ruby/2.3.0/net/http.rb:933:in `connect_nonblock'

【问题讨论】:

    标签: ruby-on-rails ruby google-maps geocode geokit


    【解决方案1】:

    我不打算发表评论,但没有人发布任何内容。由于您的特定错误消息包含 SSL 警告,我会检查您是否需要明确要求 openssl 和/或您的 openssl 设置是否正确。尽管堆栈跟踪有点不同,但我的应用程序中的地理编码超时也遇到了类似的问题。地理编码需要很长时间才能完成(例如,因为地址真的很奇怪),但我的其余代码仍在继续。我认为堆栈跟踪是 Geokit 中的一个错误。由于您无法控制它的运行速度,因此您应该首先考虑做一些事情来减少您进行此调用的次数,因此至少:

    def full_address
      @full_address ||= Geocoder.address("#{self.latlon.x}, #{self.latlon.y}")
    end
    

    您还应该考虑将 full_address 存储为计算字段,因为每次第一次访问模型实例时,上述代码仍会运行。所以摆脱上面的代码,而是添加一个 full_address 字段和一个 before save 钩子:

    在迁移文件中:

    add_column :models, :full_address, :string
    

    在你的 model.rb 中:

    before_save :geocode_address
    
    def geocode_address
      self.full_address = Geocoder.address("#{self.latlon.x}, #{self.latlon.y}") if self.changed.include?("latlon")
    end
    

    这样调用只在 latlon.x 和 latlon.y 变量更新时运行,而不是每次访问地址时运行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-11-06
      • 1970-01-01
      • 2017-06-03
      • 2011-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多