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

因此,我使用Geocoder根据用户在提交表单时提供的地址提取纬度和经度坐标。 我这样做是为了让我可以使用Google Maps API绘制标记。 这在开发中非常有效 – 零问题。 然而,当我推向生产时,Geocoder不会生成纬度和经度。 我检查了生产日志,没有错误。 我还检查确保gem不仅仅是为了开发安装而且我已经在我的生产机器上重新启动了unicorn和nginx。 关于可能发生什么的任何想法?

这是我正在执行此任务的模型的模型代码 –

class Order  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 

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

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

我找到了这个相关的问题 ,虽然我更喜欢运行这个任务服务器端,而不是客户端。

Geocoder gem的作者有这样的说法 :

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

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

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

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

更新

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

适当的超时有多长?

这很难说。 gem的作者建议15 ,正如你已经设定的那样。 地理编码服务可能暂时很慢 – 或者总体上可能很慢。 IMO,将其设置为逐渐增加并找到它开始工作的数字 – 然后将其保留在那里。

请注意, 客户端与服务器端参数可能不适用于此处。 OP问题中引用的SOpost与请求配额有关 。 相反,问题中见证的问题似乎与地理编码速度有关,无论呼叫是由客户端还是由服务器进行,​​都不会受到影响。

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

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

我希望这对你有帮助。

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

来自谷歌的人

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

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

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