Я пытаюсь добавить API Google Maps Javascript в веб-приложение Rails 5.2. У меня есть учетная запись разработчика Google и ключ API с включенным API JavaScript Карт Google. В документации Google приведен пример кода https://developers.google.com/maps/documentation/javascript/tutorial.. Я поместил его в простой HTML-файл с моим API_KEY, и он отлично работает. Но я не могу заставить его работать правильно в Rails. Три важных раздела кода:
1) На моей html странице добавьте div с id = map. Здесь будет отображаться карта.
# app/views/pages/map_page.html.erb
<div id="map"></div>
2) Вызвать Google API с помощью моего ключа API, а затем вызвать функцию initMap. Я поместил это в раздел head файла application.html.erb.
# app/views/layouts/application.html.erb
<script src="https://maps.googleapis.com/maps/api/jskey=MY_API_KEY&callback=initMap"
async defer></script>
<%= javascript_include_tag 'application', 'data-turbolinks-track': 'reload' %>
3) Определите функцию initMap с жестко закодированными координатами для карты. Я положил это в свой собственный файл JS.
# app/assets/javascripts/map.js
var map;
function initMap() {
map = new google.maps.Map(document.getElementById('map'), {
center: {lat: -34.397, lng: 150.644},
zoom: 8
});
}
Эта настройка работает, только если я обновляю страницу один или несколько раз. Я уверен, что это связано с турболинками, но если я попытаюсь обернуть эту функцию для турболинков, это сделает ее еще хуже. Затем я получаю сообщение об ошибке, в котором говорится, что initMap не является функцией, независимо от того, сколько раз я обновляю страницу.
document.addEventListener("turbolinks:load", function() {
var map;
function initMap() {
map = new google.maps.Map(document.getElementById('map'), {
center: {lat: -34.397, lng: 150.644},
zoom: 8
});
}
});
И в ответ на другой SO я изменил вызов API Google в application.html.erb на следующий, добавив data-turbolinks-eval = "false. Не повезло.
<script async
src="https://maps.googleapis.com/maps/api/jskey=MY_API_KEY&callback=initMap"
defer data-turbolinks-eval="false"></script>
Как мне заставить его работать без обновления страницы?