【发布时间】:2015-02-11 14:20:55
【问题描述】:
我正在开发一个网络应用程序,我使用 Ruby on Rails。我们的索引由地图和搜索字段组成。您可以搜索一个位置,然后地图会更新其标记。
我想使用 Ajax 来避免刷新页面。所以我在表单中添加了remote: true,在控制器中添加了一个respond_to,并且一个新的search.js.erb. My search.js.erb 呈现了一个部分_googlemap.erb,其中包含用于初始化地图的脚本。
这是我的问题。由于地图已经存在,就像我想两次创建同一个对象一样,这当然行不通,而且很糟糕。我只想用新的标记更新地图中的标记。但我找不到办法。
我看到以前版本的 Gmaps4rails 集成了一种方法 (Gmaps.map.replaceMarkers(your_markers_json_array);),但它现在似乎不起作用。当我使用它时,我得到了这个错误:“TypeError: Gmaps.map is undefined”。我尝试使用“handler.replaceMarkers();”,但这次我选择了“TypeError: handler.replaceMarkers is not a function”。
我是 Javascript 和 Rails 的新手,但我想提高我的知识,我真的需要继续使用这个网络应用程序的其余部分。我一直在互联网上到处寻找解决方案,但徒劳无功。
拜托,谁能告诉我我该怎么做以及我做错了什么?
非常感谢,
席琳
zones_controller.rb
def search
respond_to do |format|
format.html.none do
search_params = params[:zone][:search]
coordinates = Geocoder.coordinates(search_params).join(",")
@zones = Zone.search(
"", { "aroundLatLng" => coordinates,
"aroundRadius" => 500000 #Searches around 500 km
})
if coordinates.nil?
@zones = Zone.search(params[:search])
elsif @zones.empty?
@zones = Zone.all
flash[:error] = "No zone could be found. Please try again."
end
build_map(@zones)
end
format.js
end
end
def build_map(array)
@hash = Gmaps4rails.build_markers(array) do |zone, marker|
marker.lat zone.latitude
marker.lng zone.longitude
marker.json({ title: zone.description, id: zone.id })
marker.infowindow render_to_string(:partial => "/zones/map_box", locals: { zone: zone })
end
end
search.html.erb
<div id="map" style='width: 100%; height: 700px;'>
</div>
<!-- Beginning Google maps -->
<script type="text/javascript" id="map_script">
$(document).ready(function() {
<%= render 'googlemap', hash: @hash %>
}); // Document ready
</script>
_googlemap.erb
handler = Gmaps.build('Google');
handler.buildMap({ provider: {
disableDefaultUI: true,
mapTypeId: google.maps.MapTypeId.TERRAIN
}, internal: {id: 'map'}
}, function(){
markers_json = <%= raw hash.to_json %>;
markers = _.map(markers_json, function(marker_json){
marker = handler.addMarker(marker_json);
handler.getMap().setZoom(4);
_.extend(marker, marker_json);
marker.infowindow = new google.maps.InfoWindow({
content: marker.infowindow
});
return marker;
});
handler.bounds.extendWith(markers);
handler.fitMapToBounds();
});
search.js.erb
$('#map_script').replaceWith("<%= render 'googlemap', hash: @hash %>");
【问题讨论】:
-
嗨席琳。我正在解决一个类似的问题;我很欣赏你的问题和你得到的答案。我想知道您是否可以分享您的表格的外观。此外,当您最初加载搜索页面时,不会向控制器发送任何内容,因此这些区域是空的;你设置一个默认值吗?我正在尝试使用视图页面通过 geolocatoin 获取用户的位置,然后将该信息发送回控制器以获取附近的所有标记,但我不确定如何,因为信息流的顺序不是传统的。顺便说一句,您的页面看起来非常棒。
-
您好,You can find my form here。此表单位于 index.html.erb 中,并向 /search 发送一个请求,其中包含与搜索相对应的参数,因此它永远不会为空。您可以获取用户的位置(使用 IP 地理编码和 Geokit for example ),然后获取附近的所有标记并将它们发送到视图。
标签: ruby-on-rails ajax google-maps gmaps4rails