所以我使用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,虽然我更喜欢运行此任务服务器端,而不是客户端。
答案 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密钥,否则它将不起作用。