Я работаю над веб-приложением, и я использую Ruby on Rails. Наш индекс составлен из карты и поля поиска. Вы можете искать местоположение, и карта обновляет свои маркеры.Google Maps for Rails - обновить маркеры с помощью AJAX
Я бы хотел использовать Ajax, чтобы не обновлять страницу. Поэтому я добавил remote: true
к форме, respond_to
в контроллер и новый search.js.erb.
. Мой 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 %>");
Hi Celine. Я работаю через несколько схожую проблему; Я ценю ваш вопрос и ответы, которые вы получили. Мне было интересно, можете ли вы поделиться тем, как выглядит ваша форма. Кроме того, когда вы первоначально загружаете страницу поиска, ничто не посылается на контроллер, поэтому зоны поэтому пусты; вы устанавливаете значение по умолчанию? Я пытаюсь использовать страницу просмотра, чтобы получить местоположение пользователя через geolocatoin, а затем отправить эту информацию обратно контроллеру, чтобы закрыть все маркеры, но я не уверен, как с тех пор, как порядок информационного потока не является традиционным. Кстати, ваша страница выглядит действительно замечательно. – kindofgreat
Здравствуйте, [Вы можете найти мою форму здесь] (http://pastie.org/9991159). Эта форма находится в index.html.erb и отправляет запрос/поиск с параметрами, соответствующими поиску, поэтому он никогда не пуст. Вы можете получить местоположение пользователя (используя геокодирование IP с помощью [Geokit например] (https://github.com/geokit/geokit-rails)), затем закройте все маркеры и отправьте их в представление. –
Спасибо, Селин! – kindofgreat