【问题标题】:Ruby on Rails how to pass data from controller to javascript in htmlRuby on Rails如何将数据从控制器传递到html中的javascript
【发布时间】:2014-08-19 07:15:28
【问题描述】:

我正在用 ruby​​ on rails 做谷歌地图。我正在尝试在地图上实现动态标记文本。

我找到了一种在 java 脚本中添加标记文本的方法。如何将我的控制器数据(从数据库中检索的字符串数据)传递给 java?我搜索了其他帖子但无法理解他们的答案。

html中的javascript是

 <script type="text/javascript" src="http://maps.googleapis.com/maps/api/js?v=3&amp;sensor=false"></script>
 <script type="text/javascript" src="../src/markerwithlabel.js"></script>
 <script type="text/javascript">
 function initMap() {

 var latLng = new google.maps.LatLng(49.47805, -123.84716);
 var homeLatLng = new google.maps.LatLng(49.47805, -123.84716);

 var map = new google.maps.Map(document.getElementById('map_canvas'), {
   zoom: 12,
   center: latLng,
   mapTypeId: google.maps.MapTypeId.ROADMAP
 });

 var marker1 = new MarkerWithLabel({
   position: homeLatLng,
   draggable: true,
   raiseOnDrag: true,
   map: map,
   labelContent: *"text"*,
   labelAnchor: new google.maps.Point(22, 0),
   labelClass: "labels", // the CSS class for the label
   labelStyle: {opacity: 0.75}
 });
 </script>

我想将这个 "text" 替换为一个名为 text 的变量,它会从我的控制器中复制 @somestring,比如 gmaps_controller.rb

我尝试添加文本:“”我把它放在 var homelatlng 下,但没有用。

我也试过了

$(document).ready(function(){
var text='<%=j @somestring%>'
})

我把它放在一个单独的javascript标签中

<script type="text/javascript" src="../src/markerwithlabel.js"></script>

也不行。

还有其他方法可以将数据传递给控制器​​吗?请详细告诉我我是个新手。 提前致谢

【问题讨论】:

  • 我在这里提供一个例子:github.com/apneadiving/Google-Maps-for-Rails
  • 您能否分享一下,这在视图中呈现什么?
  • @apneadiving 我已经阅读了很多次,尝试关注apneadiving.github.io 将文本添加到标记。但是这个特殊的是咖啡脚本,我尝试了很多地方来添加这个咖啡脚本(试过其他javascript 他们工作!),它只是不工作 T.T 必须转向其他方法。这个带有标签的标记工作。
  • @Babar 当我尝试添加这两个时,地图显示但没有标记没有文本。似乎它出错了,因为文本值为空或语法错误
  • 在 github 示例中,他在控制器中创建了一个 json 并将其发送到视图,您尝试过吗?

标签: javascript ruby-on-rails ruby google-maps


【解决方案1】:

如何将数据从控制器传递到 html 中的 javascript

您无法访问资产中的 ruby​​ 变量。你最好的选择是使用html5 data attributes 从你的控制器传递数据,或者我应该说视图到javascript。假设你有这样的html元素:

= link_to "some text", some_path, id: "some_id", data: {value: @some_value}  #where @some_value is set in your controller

然后在javascript中像这样访问它

$(document).ready(function(){
  var text =  $("#some_id").data("value");
  // now text will contain some_value
});

【讨论】:

  • 大部分浏览器都支持这个html5吗?
  • @wen 是的,他们这样做了。我已经对它们进行了 ie9 测试,question 表明它们也适用于旧版本 :)
  • @wen 你必须在某些元素上使用 data 属性,就像我在链接中使用的那样,然后在 javascript 中访问它
【解决方案2】:

使用 gon gem。

第 1 步: 在你的 gemfile 中添加 gem'gon'

第 2 步: 运行捆绑安装

第 3 步: 在视图的标题标签中添加

第 4 步: 在控制器中添加 gon.yourpassdata="sometext"

第 5 步:从视图中获取数据,例如 alert(gon.yourpassdata)

完成!

【讨论】:

  • 我不认为只是将数据从 ruby​​ 传递到 javascript..我们需要一个 gem....@user3736098
【解决方案3】:

更清晰的方式显示地图 + 地图上的动态标记 + 动态信息窗口 + 可点击的信息窗口...。只需传递所需的对象并包含来自谷歌地图的地点 js...此代码是准备好工作了。在这里,我使用$.each 使用 infowindows 向地图动态添加标记并将其推送到数组中

我提出了类似的问题here

在您的控制器中...

def show_nearby_locations_to_guest
@nearbys = Place.near("#{params[:address]}", 5,:order => "distance",:units => :km).paginate(:page => params[:page], :per_page => 10)
end

_show_nearby_locations_to_guest.js.erb

在这个 js.erb 中(使用带有动态标记的新地图更新视图,记住你在你点击的页面上有这个选择器(任何其他)),这里我有一个 EMPTY 地图并将其替换为 NEW 地图 FILLED 与动态标记

$("#map-canvas").html("<%= escape_javascript(render(:partial => 'show_nearby_locations_to_guest')) %>");

_show_nearby_locations_to_guest.html.erb

<%= javascript_tag do%>
/////use global variable instead of using data-attribute as my resultset can have 100+ records
window.nearbys= <%=raw @nearbys.to_json %>;
<%end%>


<script type="text/javascript">
var pinColor = "000000";
var map;
var bounds = new google.maps.LatLngBounds();
var mapOptions = {
mapTypeId: 'roadmap'
};
function initialize() {
// Display a map on the page
map = new google.maps.Map(document.getElementById("map-canvas"), mapOptions);
map.setTilt(45);
//emtpy array to add dynamic markers
var markers=[];
//emtpy array to add dynamic infowindows 
var infoWindowContent=[];
$.each(nearbys, function(index) {
markers.push([nearbys[index]['title'], nearbys[index]['latitude'],nearbys[index]['longitude']]);
infoWindowContent.push(['<div class="info_content" >' +
'<h3'+nearbys[index]['title']+'</h3>' +
'<p><i>'+nearbys[index]['about']+'</i></p>' +
'<p><a href="/places/show/'+nearbys[index]['id']+'" data-remote="true" title="view more">view more</a></p>' +
'</div>']);
});
// Display multiple markers on a map
var infoWindow = new google.maps.InfoWindow({ maxWidth: 320 }), marker, i;
// Loop through our array of markers & place each one on the map
for( i = 0; i < markers.length; i++ ) {
var position = new google.maps.LatLng(markers[i][1], markers[i][2]);
bounds.extend(position);
var pinImage = new google.maps.MarkerImage("http://chart.apis.google.com/chart?chst=d_map_pin_letter&chld="+markers[i][0].charAt(0).toUpperCase()+"|FE7569|" + pinColor,
new google.maps.Size(21, 34),
new google.maps.Point(0,0),
new google.maps.Point(10, 34));
marker = new google.maps.Marker({
position: position,
map: map,
title: markers[i][0],
icon: pinImage
});
// Allow each marker to have an info window
google.maps.event.addListener(marker, 'click', (function(marker, i) {
return function() {
infoWindow.setContent(infoWindowContent[i][0]);
infoWindow.open(map, marker);
}
})(marker, i));
// Automatically center the map fitting all markers on the screen
map.fitBounds(bounds);
}
// Override our map zoom level once our fitBounds function runs (Make sure it only runs once)
var boundsListener = google.maps.event.addListener((map), 'bounds_changed', function(event) {
this.setZoom(14);
google.maps.event.removeListener(boundsListener);
});
}//initialize ends
$(document).ready(function(){
$('#map-canvas').html("<p class='text-center text-alert'><b><i>Loading map...</i><i class='fa fa-spinner fa-spin fa-2x'></i></b></p>");
//load the map after 2 seconds so that the same code can work on modals as well
setTimeout('initialize()', 2000);

【讨论】:

  • 这是window.nearbys= ;从控制器复制数据?这个窗口是什么?我觉得你最有可能工作,但我将它们复制到我的代码中不起作用。
  • @wen... window.variable..只是一种将值全局存储到页面的方法..就像您存储在 data-attribute=your_values 中一样...所以您将其存储在全局中可用于整个页面的变量,然后像往常一样访问它。试一试...
  • window.nearbys= ;我应该把这段代码放在哪里?我试过 window.nearbys="hi" 并把 alert(window.nearbys) ,它没有显示任何消息,也没有 alert(nearbys) 。这部分似乎不起作用?
  • @wen 永远记得把 ruby​​ 代码放在 你的 ruby​​ 代码在 js 中设置 .... 当你在 html.erb 文件中而不是在这些类型的场景中的
  • 我能知道你的 show_nearby_locations_to_guest 文件里面有什么吗?我有问题单独显示标记和地图 T.T
猜你喜欢
  • 2021-08-27
  • 2012-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-21
  • 1970-01-01
  • 2013-03-24
  • 1970-01-01
相关资源
最近更新 更多