Rails—如何从数据库获取信息并将其放入javascript变量
我正在使用一个在主页上加载一张地图的模板,它从一个js filelocations.js获取信息Rails—如何从数据库获取信息并将其放入javascript变量,javascript,ruby-on-rails,postgresql,dictionary,Javascript,Ruby On Rails,Postgresql,Dictionary,我正在使用一个在主页上加载一张地图的模板,它从一个js filelocations.js获取信息 function createHomepageGoogleMap(_latitude,_longitude){ setMapHeight(); if( document.getElementById('map') != null ){ $.getScript("assets/js/locations.js", function(){ var map = new google.
function createHomepageGoogleMap(_latitude,_longitude){
setMapHeight();
if( document.getElementById('map') != null ){
$.getScript("assets/js/locations.js", function(){
var map = new google.maps.Map(document.getElementById('map'), {
zoom: 12,
scrollwheel: false,
center: new google.maps.LatLng(_latitude, _longitude),
mapTypeId: google.maps.MapTypeId.ROADMAP,
styles: mapStyles
});
var i;
var newMarkers = [];
for (i = 0; i < locations.length; i++) {
var pictureLabel = document.createElement("img");
pictureLabel.src = locations[i][7];
var boxText = document.createElement("div");
infoboxOptions = {
content: boxText,
disableAutoPan: false,
//maxWidth: 150,
pixelOffset: new google.maps.Size(-100, 0),
zIndex: null,
alignBottom: true,
boxClass: "infobox-wrapper",
enableEventPropagation: true,
closeBoxMargin: "0px 0px -8px 0px",
closeBoxURL: "assets/img/close-btn.png",
infoBoxClearance: new google.maps.Size(1, 1)
};
var marker = new MarkerWithLabel({
title: locations[i][0],
position: new google.maps.LatLng(locations[i][3], locations[i][4]),
map: map,
icon: 'assets/img/marker.png',
labelContent: pictureLabel,
labelAnchor: new google.maps.Point(50, 0),
labelClass: "marker-style"
});
newMarkers.push(marker);
boxText.innerHTML =
'<div class="infobox-inner">' +
'<a href="' + locations[i][5] + '">' +
'<div class="infobox-image" style="position: relative">' +
'<img src="' + locations[i][6] + '">' + '<div><span class="infobox-price">' + locations[i][2] + '</span></div>' +
'</div>' +
'</a>' +
'<div class="infobox-description">' +
'<div class="infobox-title"><a href="'+ locations[i][5] +'">' + locations[i][0] + '</a></div>' +
'<div class="infobox-location">' + locations[i][1] + '</div>' +
'</div>' +
'</div>';
//Define the infobox
newMarkers[i].infobox = new InfoBox(infoboxOptions);
google.maps.event.addListener(marker, 'click', (function(marker, i) {
return function() {
for (h = 0; h < newMarkers.length; h++) {
newMarkers[h].infobox.close();
}
newMarkers[i].infobox.open(map, this);
}
})(marker, i));
}
var clusterStyles = [
{
url: 'assets/img/cluster.png',
height: 37,
width: 37
}
];
var markerCluster = new MarkerClusterer(map, newMarkers, {styles: clusterStyles, maxZoom: 15});
$('body').addClass('loaded');
setTimeout(function() {
$('body').removeClass('has-fullscreen-map');
}, 1000);
$('#map').removeClass('fade-map');
// Dynamically show/hide markers --------------------------------------------------------------
google.maps.event.addListener(map, 'idle', function() {
for (var i=0; i < locations.length; i++) {
if ( map.getBounds().contains(newMarkers[i].getPosition()) ){
// newMarkers[i].setVisible(true); // <- Uncomment this line to use dynamic displaying of markers
//newMarkers[i].setMap(map);
//markerCluster.setMap(map);
} else {
// newMarkers[i].setVisible(false); // <- Uncomment this line to use dynamic displaying of markers
//newMarkers[i].setMap(null);
//markerCluster.setMap(null);
}
}
});
// Function which set marker to the user position
function success(position) {
var center = new google.maps.LatLng(position.coords.latitude, position.coords.longitude);
map.panTo(center);
$('#map').removeClass('fade-map');
}
});
// Enable Geo Location on button click
$('.geo-location').on("click", function() {
if (navigator.geolocation) {
$('#map').addClass('fade-map');
navigator.geolocation.getCurrentPosition(success);
} else {
error('Geo Location is not supported');
}
});
}
更新
此代码将加载locations.js
function createHomepageGoogleMap(_latitude,_longitude){
setMapHeight();
if( document.getElementById('map') != null ){
$.getScript("assets/js/locations.js", function(){
var map = new google.maps.Map(document.getElementById('map'), {
zoom: 12,
scrollwheel: false,
center: new google.maps.LatLng(_latitude, _longitude),
mapTypeId: google.maps.MapTypeId.ROADMAP,
styles: mapStyles
});
var i;
var newMarkers = [];
for (i = 0; i < locations.length; i++) {
var pictureLabel = document.createElement("img");
pictureLabel.src = locations[i][7];
var boxText = document.createElement("div");
infoboxOptions = {
content: boxText,
disableAutoPan: false,
//maxWidth: 150,
pixelOffset: new google.maps.Size(-100, 0),
zIndex: null,
alignBottom: true,
boxClass: "infobox-wrapper",
enableEventPropagation: true,
closeBoxMargin: "0px 0px -8px 0px",
closeBoxURL: "assets/img/close-btn.png",
infoBoxClearance: new google.maps.Size(1, 1)
};
var marker = new MarkerWithLabel({
title: locations[i][0],
position: new google.maps.LatLng(locations[i][3], locations[i][4]),
map: map,
icon: 'assets/img/marker.png',
labelContent: pictureLabel,
labelAnchor: new google.maps.Point(50, 0),
labelClass: "marker-style"
});
newMarkers.push(marker);
boxText.innerHTML =
'<div class="infobox-inner">' +
'<a href="' + locations[i][5] + '">' +
'<div class="infobox-image" style="position: relative">' +
'<img src="' + locations[i][6] + '">' + '<div><span class="infobox-price">' + locations[i][2] + '</span></div>' +
'</div>' +
'</a>' +
'<div class="infobox-description">' +
'<div class="infobox-title"><a href="'+ locations[i][5] +'">' + locations[i][0] + '</a></div>' +
'<div class="infobox-location">' + locations[i][1] + '</div>' +
'</div>' +
'</div>';
//Define the infobox
newMarkers[i].infobox = new InfoBox(infoboxOptions);
google.maps.event.addListener(marker, 'click', (function(marker, i) {
return function() {
for (h = 0; h < newMarkers.length; h++) {
newMarkers[h].infobox.close();
}
newMarkers[i].infobox.open(map, this);
}
})(marker, i));
}
var clusterStyles = [
{
url: 'assets/img/cluster.png',
height: 37,
width: 37
}
];
var markerCluster = new MarkerClusterer(map, newMarkers, {styles: clusterStyles, maxZoom: 15});
$('body').addClass('loaded');
setTimeout(function() {
$('body').removeClass('has-fullscreen-map');
}, 1000);
$('#map').removeClass('fade-map');
// Dynamically show/hide markers --------------------------------------------------------------
google.maps.event.addListener(map, 'idle', function() {
for (var i=0; i < locations.length; i++) {
if ( map.getBounds().contains(newMarkers[i].getPosition()) ){
// newMarkers[i].setVisible(true); // <- Uncomment this line to use dynamic displaying of markers
//newMarkers[i].setMap(map);
//markerCluster.setMap(map);
} else {
// newMarkers[i].setVisible(false); // <- Uncomment this line to use dynamic displaying of markers
//newMarkers[i].setMap(null);
//markerCluster.setMap(null);
}
}
});
// Function which set marker to the user position
function success(position) {
var center = new google.maps.LatLng(position.coords.latitude, position.coords.longitude);
map.panTo(center);
$('#map').removeClass('fade-map');
}
});
// Enable Geo Location on button click
$('.geo-location').on("click", function() {
if (navigator.geolocation) {
$('#map').addClass('fade-map');
navigator.geolocation.getCurrentPosition(success);
} else {
error('Geo Location is not supported');
}
});
}
现在,我想使用Rails从数据库postgres加载地图信息
有没有办法直接从postgres中获取这些信息到locations.js文件中,而不必更改我的模板代码
我对开发不是很在行,所以如果我让这个location.js的工作方式不同于一些map gem=/,那么就更容易了。为了从数据库中获取信息,您需要使用Ruby代码,因为您的js无法解释Ruby。在这种情况下,有几种方法可以使用 1在页面上的某个位置的数据HTML属性中呈现所需的数据,并在javascript文件中获取该数据 2使用js.erb或直接在html.erb文件中呈现js 我个人更喜欢使用数据属性方法。您的模板可能如下所示
<div class="map" data-map="<%= ['2479 Murphy Court'].to_json %>
# stuff
</div>
var locations = JSON.parse($('.map').data('map'));