Geocoder Gem 在生产环境中不起作用

Posted

技术标签:

【中文标题】Geocoder Gem 在生产环境中不起作用【英文标题】:Geocoder Gem not working in Production Environment 【发布时间】:2014-01-31 16:02:40 【问题描述】:

所以我使用Geocoder 根据用户在提交表单时提供的地址提取经纬度坐标。我这样做是为了可以使用 Google Maps API 绘制标记。这在开发中完美运行 - 零问题。但是,当我投入生产时,地理编码器不会生成纬度和经度。我检查了我的生产日志,并且错误为零。我还检查以确保 gem 不仅是为开发而安装的,而且我已经在我的生产机器上重新启动了 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 控制台
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

设置的适当超时限制是多少?我需要坐标,但也不想让它永远运行......

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

我找到了这个related question,虽然我更喜欢在服务器端而不是在客户端运行这个任务。

【问题讨论】:

是否有任何错误被抛出?或者它根本不产生纬度/经度?它产生了什么 @zeantsoi - 我在我的问题中声明没有抛出错误。它根本不生成(或存储)纬度/经度坐标。就像我上面提到的,这在开发中非常有效。 您是如何获得这些结果的?您是否尝试过新重新启动的控制台会话? 文档似乎有更新语法:在#config/initializers/geocoder.rb 中,执行:Geocoder.configure(:timeout =&gt; 30) 【参考方案1】:

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

【讨论】:

让它运行,在应用它并将限制增加到 30 之后,我成功运行了 Geocoder.search("San Francisco, CA") 命令。【参考方案2】:

Geocoder gem 的作者有this to say:

[A]您确定应用服务器在您添加 Geocoder 后已重新启动?

首先,通过在生产控制台中发出 Geocoder 命令来验证 gem 确实已安装:

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

如果这没有引发任何错误,请尝试重新启动服务器。软启动可能会起作用——硬启动更好。这将重新加载您的整个 Rails 环境,包括所有已安装的依赖项。

更新

正如该答案的 cmets 中所述,该问题与 Geocoding API not responding fast enough 错误有关。

合适的超时时间是多久?

这很难说。 gem 的作者suggests 15,因为您已经将其设置为。地理编码服务可能会暂时变慢 - 或者整体上可能很慢。 IMO,将其设置得更高一些,然后找到它开始工作的数字——然后把它留在那里。

请注意,client-side vs. server-side argument 可能不适用于此处。 OP 问题中引用的 SO 帖子与 请求配额 相关。相比之下,问题中出现的问题似乎与地理编码速度有关,无论调用是由客户端还是由服务器进行的,这都不会受到影响。

【讨论】:

所以这最终对我产生了一个错误 - 地理编码 API 响应速度不够快(使用 Geocoder.configure(:timeout => ...) 来设置限制)。 => [] ------ 适当的超时时间是多少?我目前在我的 geocoder.rb 初始化文件中声明 Geocoder::Configuration.timeout = 15 这是一个很难给出明确答案的问题 - 请参阅我的更新以获得一些见解。 将超时值更改为 30,现在一切都在生产应用程序上运行。谢谢你:)【参考方案3】:

我认为是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

)

希望对你有所帮助。

【讨论】:

【参考方案4】:

检查您的网络连接。我发现当我使用更快的连接时,问题得到了缓解。就我而言,我从咖啡店的公共 wifi 连接转到手机上的 LTE 热点。

【讨论】:

【参考方案5】:

来自 Google 人员

*我们建议响应用户输入并因此对延迟高度敏感的应用程序使用 Places API 中的 Place Autocomplete 功能(也可用于 javascriptandroidios),而不是地址地理编码。地点自动完成经过优化,可交互使用,因此延迟非常低。

Geocoding API 中的地址地理编码经过优化,可用于完整、明确、格式正确的地址,例如在线表单中输入的送货地址,因此延迟时间比地点自动完成要高。旧的正向地理编码器已经是这种情况。 Place Autocomplete 与新的正向地理编码器之间的延迟差异进一步增加,因为新的地理编码器具有更大的覆盖范围和更好的结果质量,但代价是延迟稍高。*

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

【讨论】:

【参考方案6】:

您必须在config/initializers/geocoder.rb 上为生产环境设置查找服务,例如 google、yandex 等。否则它不会返回您所有请求的坐标。

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

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

【讨论】:

以上是关于Geocoder Gem 在生产环境中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

亚马逊应用内购买在生产环境中不起作用

Rails 5 缓存在本地或生产环境中不起作用

Cron 工作在每当 gem 中不起作用

:footnotes 扩展在 Redcarpet Ruby gem 中不起作用

适用于 iOS 的 Google Firebase 推送通知在生产环境中不起作用

盖茨比动态样式在生产版本中不起作用