0

我有一个 ruby​​ on rails 应用程序,它有一个带有标记的谷歌地图,当你点击它时,它会使用 javascript 打开一个信息窗口。我想把 ruby​​ var 放在这个 javascript fn 中,它在窗口中显示来自数据库的信息。

因此,当用户单击标记时,他们会从数据库中获取动态信息,而不仅仅是来自 js fn 的通用文本。

如果有人在此之前做过,如果您能告诉我您是如何做到的,我将不胜感激,谢谢

4

2 回答 2

2

您可以使用标记将您的 javascript 直接放在 html.erb 文件中,并在 javascript 中运行嵌入的 ruby​​ 代码。请记住 escape_javascript,因为有时您的变量会被一些特殊字符(如撇号)弄乱您的脚本。

<script>
  alert(<%= escape_javascript @variable %>);
</script> 
于 2013-01-23T19:24:48.663 回答
1

Edward 使用 erb 处理 Javascript 文件的解决方案将起作用(尽管您必须记住将 .erb 添加到 JS 文件的末尾,以便 ERB 知道要处理它……即 maps.js.erb)。

问题是,这与我所理解的资产管道的理念背道而驰。Rails 特意将所有 Javascript 连接到一个文件中,以节省 HTTP 请求的开销。然而,更重要的是,浏览器会缓存这个文件,因此他们不需要在每次请求时重新获取它。如果你有一个变量会根据发出的请求更改 JS 文件,Rails 需要为每个请求重新处理 JS 文件,这很昂贵。(请注意,相同的概念也适用于 CSS)。

我发现的最佳解决方案是以某种方式将变量值放在页面中,因为这是一个需要在每个请求上动态处理的文件。通常我看到人们把它们放在隐藏的形式中,例如:

<%= content_tag :input, nil, :type => 'hidden', :id => "map-name-field", :'data-name' => @map.name %> 

我还使用的一种方法是将其附加到页面上的一个元素,该元素对该页面是唯一的,例如名称或标题:

<%= content_tag :h2, @map.name, :id => "map-name", :'data-name' => @map.name %>

一旦它在页面上,您可以从您的 JS 函数中获取(但这里的关键是 fetcher 函数对于您的地图的所有实例都是相同的,因此不需要更改或重新处理 JS 文件):

// Assuming jQuery
// For the hidden input approach:
var mapName = $('#map-name-field').value
// or for the data-attribute approach:
var mapName = $('#map-name').attr('data-name')
于 2013-01-23T20:15:51.250 回答