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