Каждое учебное пособие по картам, которое я видел, ведет к тупику встроенных тегов сценариев и глобальных переменных, когда на самом деле довольно легко выполнить работу "правильным способом".
Просто используйте элемент с атрибутами данных для передачи информации из представления в JavaScript:
<%= content_tag :div,
"",
class: 'google-maps-widget', # call it whatever you want
data: {
lat: @place.latitude,
lng: @place.longitude
}
%>
В идеале вы можете DRY этот код в качестве вспомогательного метода. Затем просто установите обработчик событий, который загружает карту при начальной загрузке страницы или когда турболинки обновляют страницу .
document.addEventListener("turbolinks:load", function(){
// find the maps on the page
let maps = document.querySelectorAll(".google-maps-widget");
// loop through the maps
maps.forEach(function(element){
let data = element.dataset;
if (!data.initialized) {
let map = new google.maps.Map(element, {
// you can just use a object literal instead
center: { lat: data.lat, lng: data.lng },
// lets you override the inital zoom
zoom: data.zoom || 14
});
// This keeps the element from being re-initialized
// if turbolinks persists it
element.dataset.initialized = "true";
}
});
});
Если вы хотите добавить на карту несколько маркеров, Вы можете просто добавить группу элементов внутри элемента <div class="google-maps-widget"...
:
<div class="google-maps-widget" ... >
<div class="marker hidden" data-lng="1" data-lng="2">My Favorite spot</div>
...
<end>
Вы могли бы разобрать их при инициализации карты. Или вы добавляете атрибут данных к элементу карты с URI, где вы можете выбрать маркеры с помощью AJAX.