我有一个 ruby on rails 应用程序,它有一个带有标记的谷歌地图,当你点击它时,它会使用 javascript 打开一个信息窗口。我想把 ruby var 放在这个 javascript fn 中,它在窗口中显示来自数据库的信息。
因此,当用户单击标记时,他们会从数据库中获取动态信息,而不仅仅是来自 js fn 的通用文本。
如果有人在此之前做过,如果您能告诉我您是如何做到的,我将不胜感激,谢谢
我有一个 ruby on rails 应用程序,它有一个带有标记的谷歌地图,当你点击它时,它会使用 javascript 打开一个信息窗口。我想把 ruby var 放在这个 javascript fn 中,它在窗口中显示来自数据库的信息。
因此,当用户单击标记时,他们会从数据库中获取动态信息,而不仅仅是来自 js fn 的通用文本。
如果有人在此之前做过,如果您能告诉我您是如何做到的,我将不胜感激,谢谢
您可以使用标记将您的 javascript 直接放在 html.erb 文件中,并在 javascript 中运行嵌入的 ruby 代码。请记住 escape_javascript,因为有时您的变量会被一些特殊字符(如撇号)弄乱您的脚本。
<script>
alert(<%= escape_javascript @variable %>);
</script>
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')