Geocoder Gem无法在生产环境中工作

时间:2014-01-31 16:02:40

标签: ruby-on-rails ruby production-environment rails-geocoder

所以我使用Geocoder根据用户在提交表单时提供的地址提取纬度和经度坐标。我这样做是为了让我可以使用Google Maps API绘制标记。这在开发中非常有效 - 零问题。然而,当我推向生产时,Geocoder不会生成纬度和经度。我检查了我的生产日志,没有错误。我还检查确保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,虽然我更喜欢运行此任务服务器端,而不是客户端。

6 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:3)

Geocoder gem的作者有this to say

  

[A]你确定自从你添加了Geocoder后重启了app服务器吗?

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

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

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

<强>更新

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

适当的超时有多长?

这很难说。宝石的作者suggests 15,正如你已经设定的那样。地理编码服务可能暂时很慢 - 或者总体上可能很慢。 IMO,逐渐增加它并找到它开始工作的数字 - 然后把它留在那里。

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

答案 2 :(得分:1)

我认为这是freegeoip的一个问题,请尝试以下方法:

在rails控制台中输入:

Geocoder.configure(:ip_lookup =&gt;: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

)

我希望这对你有所帮助。

答案 3 :(得分:0)

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

答案 4 :(得分:0)

来自Google专家

*我们建议响应用户输入且因此对延迟非常敏感的应用程序使用Places API中的地方自动填充功能(也可在JavaScript,Android或iOS中使用),而不是地址编码。 Place Autocomplete经过优化,可以交互使用,因此具有非常低的延迟。

地理编码API中的地址编码经过优化,可与完整,明确,格式良好的地址一起使用,例如输入到在线表单中的传递地址,因此具有比地方自动填充更高的延迟。旧的前向地理编码器就是这种情况。 Place Autocomplete和新的前向地理编码器之间的延迟差异进一步增加,因为新的地理编码器具有更大的覆盖范围和更好的结果质量,但代价是延迟稍高。*

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

答案 5 :(得分:0)

您必须在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密钥,否则它将不起作用。