生产环境中Geocoder Gem无法工作

3

我正在使用 Geocoder 来根据用户在提交表单时提供的地址获取纬度和经度坐标。我这样做是为了使用Google Maps API绘制标记。在开发中,这完美地运作 - 没有问题。然而当我推送到生产环境时,Geocoder没有生成纬度和经度。我已经检查了我的生产日志,并没有错误。我还检查了宝石是否只安装在开发环境中,我已经在我的生产机器上重新启动了unicorn和nginx。对于可能发生的情况有任何想法吗?

这是我用来执行此任务的模型代码--

class Order < ActiveRecord::Base

  attr_accessible :city, :customer_email, :customer_id, :delivery_date, :delivery_time, :street, :zipcode, :coupon, :total, :name, :items_with_day, :user_id, :shopping_cart_id, :extras, :latitude, :longitude, :location_name, :phone, :suite, :state

  belongs_to :user

  validates :name, :presence => true
  validates :street, :presence => true
  validates :city, :presence => true
  validates :zipcode, :presence => true

  def address
    [street, city, state, "United States"].compact.join(', ')
  end

  geocoded_by :address
  after_validation :geocode

end

============ 更新 =============

在得到建议后,我使用 -- 命令在我的生产机器上打开了 rails 控制台。

注:rails 控制台是一个交互式终端,可用于在应用程序上下文中执行命令和查询数据库等操作。

bundle exec rails console production

并运行--

Geocoder.search("San Francisco, CA")

导致该错误的原因是--

Geocoding API not responding fast enough (use Geocoder.configure(:timeout => ...) to set limit).
=> []

话虽如此,在我的config/initilizers/geocoder.rb文件中,我有--

Geocoder::Configuration.timeout = 15

适当的超时限制是多久?我需要坐标,但也不想让它无限制运行...

=========== 更新 =============

我发现了这个相关问题,尽管我更喜欢在服务器端而不是客户端上运行此任务。


有任何错误被抛出吗?还是它只是没有生成纬度/经度?它到底生成了什么? - zeantsoi
@zeantsoi - 我在我的问题中已经说明没有出现任何错误。它只是没有生成(或存储)纬度/经度坐标。就像我上面提到的,这在开发环境中完美运行。 - Noah Davis
你是怎么得到这些结果的?你尝试过在一个新启动的控制台会话中吗? - xlembouras
文档似乎已经更新了语法:在 # config/initializers/geocoder.rb 中,执行:Geocoder.configure(:timeout => 30) - brntsllvn
6个回答

6

在生产环境中,您的初始化程序可能未加载。请尝试运行控制台命令 (bundle exec rails console production) 并在控制台中运行 Geocoder::Configuration.timeout = 15,然后再次尝试您的测试命令。


经过应用此方法并将限制增加到30后,我成功运行了Geocoder.search("San Francisco, CA")命令。 - Noah Davis

3

Geocoder gem的作者这样说道:

你确定在添加Geocoder后重启了应用程序服务器吗?

首先,在生产控制台中发出Geocoder命令来验证是否确实安装了该gem:

# from the production console
Geocoder.search("San Francisco, CA")

如果没有出现任何错误,尝试重新启动服务器。软重启可能有效 - 硬重启更好。这将重新加载整个Rails环境,包括任何已安装的依赖项。
更新:
如本答案的评论中所提到的,问题与Geocoding API未能快速响应有关。
适当的超时时间是多长?
很难说。该gem的作者建议设置为15,就像您已经设置的那样。地理编码服务可能暂时缓慢 - 或者总体上缓慢。我认为,将其逐步增加并找到开始工作的数字,然后保持在那里。
请注意,客户端 vs. 服务器端的争论 可能不适用于此处。 OP 的问题中引用的 SO 帖子与请求配额有关。相比之下,问题似乎与地理编码速度有关,无论是客户端调用还是服务器端调用都不会受到影响。

所以,这最终为我生成了一个错误 - 地理编码API响应不够快(使用Geocoder.configure(:timeout => ...)来设置限制)。=> [] ------ 适当的超时时间是多长?我目前在我的geocoder.rb初始化文件中设置了Geocoder::Configuration.timeout = 15。 - Noah Davis
这是一个很难给出明确答案的问题 - 请查看我的更新以获取一些见解。 - zeantsoi
将超时值更改为30后,生产应用程序现在一切正常。谢谢 :) - Noah Davis

1

我认为这是与freegeoip有关的问题,请尝试以下操作:

在你的rails控制台中输入以下内容:

Geocoder.configure(:ip_lookup => :telize)

现在在控制台中尝试搜索。

如果这个操作有效,你可以将它添加到你的文件中(config/initializers/geocoder.rb)。

Geocoder.configure(

  :timeout=>20,

  :lookup=>:yandex,

  :ip_lookup=>:telize,

  :language=>:en,

  :http_headers=>{},

  :use_https=>false,

  :http_proxy=>nil,

  :https_proxy=>nil,

  :api_key=>nil,

  :cache=>nil,

  :cache_prefix=>"geocoder:",

  :units=>:km,

  :distances=>:linear

)

我希望这能帮助你。


0

你需要在生产环境中设置一个查找服务,例如 Google、Yandex 等,位于 config/initializers/geocoder.rb 中。否则,它将无法为您的所有请求返回坐标。

Geocoder.configure(
  timeout: 3,
  lookup: :google,
  api_key: ENV['GOOGLE_MAPS_API_KEY'],
  units: :km
)

如果您将其设置为与Google配合使用,请确保在https://console.developers.google.com上创建API帐户以获取API密钥,否则它将无法正常工作。


0

检查您的网络连接。我发现当我连接到更快的网络时,问题得到了缓解。在我的情况下,我从咖啡店的公共WiFi连接切换到了手机上的LTE热点。


0

来自Google的建议

*我们建议对于响应用户输入且高度敏感的应用程序,使用Places API中的Place Autocomplete功能(也可在JavaScript、Android或iOS中使用),而不是地址地理编码。Place Autocomplete经过优化,可与用户进行交互,并具有非常低的延迟。

Geocoding API中的地址地理编码针对完整、明确、格式良好的地址进行了优化,例如输入在线表单的送货地址,因此比Place Autocomplete具有更高的延迟。这已经是旧正向地理编码器的情况了。由于新的地理编码器覆盖范围更广,结果质量更好,但代价是稍微更高的延迟,因此Place Autocomplete和新的正向地理编码器之间的延迟差异进一步增加。*

https://developers.google.com/maps/documentation/geocoding/faq


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接