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 => 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 功能(也可用于 javascript、android 或 ios),而不是地址地理编码。地点自动完成经过优化,可交互使用,因此延迟非常低。
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 在生产环境中不起作用的主要内容,如果未能解决你的问题,请参考以下文章
:footnotes 扩展在 Redcarpet Ruby gem 中不起作用