Я работаю над веб-приложением и использую 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, но я хочу улучшить свои знания, и мне действительно нужно продолжить работу с остальной частью этого веб-приложения. Я искал решение везде в Интернете, но напрасно.
Подскажите, пожалуйста, как мне это сделать и что я делаю не так?
Спасибо заранее,
Селин
zone_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 %>");