【发布时间】:2015-08-05 04:07:57
【问题描述】:
我正在开发一个简单的 Rails 应用程序,该应用程序允许用户输入邮政编码来查找该地区的酒吧和餐馆列表。
登录页面有一个邮政编码的表单字段。提交邮政编码后,应用会返回位置列表并使用 Google 的 api 呈现带有图钉的地图。
这是我的 javascript,目前位于 layouts/application.html.erb:
function initialize() {
var pins = <%= raw @pins.as_json -%>;
var map = new google.maps.Map(document.getElementById('map-canvas'), {
zoom: 12,
center: new google.maps.LatLng(pins[0][1], pins[0][2]),
mapTypeId: google.maps.MapTypeId.ROADMAP
});
var marker, i;
for (i = 0; i < pins.length; i++) {
marker = new google.maps.Marker({
position: new google.maps.LatLng(pins[i][1], pins[i][2]),
map: map,
title:pins[i][0]
});
};
}
这是我的来自 locations_controller.rb 的控制器
def index
@locations = Location.all
@results = @locations.where(params[:zip])
@pins = @results.map{|r| [r.name, r['latitude'], r['longitude']]}
end
所有这些都运行良好。但是,我还想在用户第一次登陆页面时根据他们当前的位置显示地图,所以我修改了控制器如下:
def index
# @ip = request.ip
@ip = "152.86.199.175" #set a default ip since I am working locally
Geocoder.configure(:ip_lookup => :telize) #without this, my api request times out
user_zip = Geocoder.search(@ip).first.data['postal_code']
zip = params[:zip].present? ? params[:zip] : user_zip
@locations = Location.all
@results = @locations.where(:zip => zip)
@pins = @results.map{|r| [r.name, r['latitude'], r['longitude']]}
end
如果我在 Rails 控制台中运行修改后的代码,它就可以工作。我能够找到用户的 zip 并根据它生成一个 pin 列表。但是,它在应用程序中不起作用。 javascript 函数从控制器获取的引脚数组为空。
我已经尝试调试了几天。我最好的猜测是 javascript 在控制器运行之前运行,并且引脚数组尚未构建。我尝试将函数包装在 $( document ).ready() 和 $(document).on("pageload") 中,但都没有帮助。我还尝试在 javascript 中创建一个条件来检查是否有任何引脚,如果没有,则向控制器发出 ajax 请求。不幸的是,我最终收到了两个请求,但没有得到任何密码。
我对 javascript 时间的假设是否正确?谁能解释为什么javascript函数在一个实例中获得一组引脚,而在另一个实例中却没有?有人对这项工作有什么建议吗?
谢谢
【问题讨论】:
-
您的地图在这两种情况下都正确构建了吗?销和无销。或者它不在第二类调用中创建地图?
-
仅在通过表单提供 zip 时构建。当您最初登陆页面时,没有地图、图钉和位置列表。
-
尝试添加一些只有 1 毫秒的 jquery 超时功能。这可能会解决您的问题
-
在你的地图上初始化 js 方法..
-
没用,但值得一试。谢谢
标签: javascript ruby-on-rails google-maps