如何在 Rails 视图中将 Ruby 变量传递给 JavaScript 函数?

IT技术 javascript ruby-on-rails prototypejs
2021-02-27 02:16:45

我想知道在 Rails 视图中将变量传递给 JavaScript 函数的最佳实践是什么。现在我正在做类似的事情:

<% content_for :javascript do %> 
  <script type="text/javascript">
    Event.observe(window, 'load', function(){          
        js_function(<%= @ruby_array.to_json %>, <%= @ruby_var %>); )}
  </script>
<% end %>

这是正确的方法吗?

6个回答

几个选项:

escape_javascript

别名:j

仅适用于字符串。

将在 Javascript 字符串中具有特殊含义的字符(如反斜杠转义)转义为适合放在 Javascript 字符串文字引号内的格式。

保持html_safe输入的状态,因此需要html_safe其他特殊的 HTML 字符,例如<会被转义为&lt;.

<% a = "\\n<" %>
<%= javascript_tag do %>
  '<%= j(a)           %>' === '\\n&lt;'
  '<%= j(a).html_safe %>' === '\\n<'
<% end %>

to_json + html_safe

正如维亚切斯拉夫所说,去给他点赞。

之所以有效,是因为 JSON几乎是 Javascript object literal notation 的一个子集

不仅适用于哈希对象,还适用于字符串、数组和整数,它们被转换为相应数据类型的 JSON 片段。

<% data = { key1: 'val1', key2: 'val2' } %>
<%= javascript_tag do %>
  var data = <%= data.to_json.html_safe %>
  data.key1 === 'val1'
  data.key2 === 'val2'
<% end %>

数据属性

向属性添加值,使用 Javascript DOM 操作检索它们。

更好地与content_tag助手:

<%= content_tag 'div', '', id: 'data', data: {key1: 'val1', key2: 'val2'} %>
<%= javascript_tag do %>
  $('#data').data('key1') === 'val1'
  $('#data').data('key2') === 'val2'
<% end %>

有时称为“不显眼的 Javascript”。

专门用于这项工作的图书馆:https : //github.com/gazay/gon

可能是最强大的解决方案。

宝石档案:

gem 'gon'

控制器:

gon.key1 = 'val1'
gon.key2 = 'val2'

布局app/views/layouts/application.html.erb

<html>
<head>
  <meta charset="utf-8"/>
  <%= include_gon %>

看法:

<%= javascript_tag do %>
  gon.key1 === 'val1'
  gon.key2 === 'val2'
<% end %>

也可以看看

- content_for :javascripts_vars do
  = "var costs_data = #{@records[:cost_mode][:data].to_json}".html_safe
  = "var graph_data = #{@records[:cost_mode][:graph].to_json}".html_safe

有一种技术叫做“unobtrusive javascript”。这是关于它的 Railscast:链接文本它适用于原型和 jQuery。还有一些插件可以帮助简化文章中描述的一些任务。

我发现 gem客户端变量,它可以帮助您轻松完成。

请尝试阅读此stackoverflow.com/help/deleted-answers,以进一步了解如何回答。即:“不能从根本上回答问题的答案”:仅是指向外部站点的链接
2021-04-26 02:16:45

在 HAML 中,数据可以这样呈现:

.position{data: {latitude: @claim.latitude.to_json, longitude: @claim.longitude.to_json}}

:javascript
   var latitude = $('.position').data('latitude');
   var longitude = $('.position').data('longitude');