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

Ten*_*ack 11 javascript ruby-on-rails prototypejs

我想知道在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 %>
Run Code Online (Sandbox Code Playgroud)

这是正确的方法吗?

Cir*_*四事件 21

一些选择:

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 %>
Run Code Online (Sandbox Code Playgroud)

to_json + html_safe

正如维亚切斯拉夫所提到的那样,请向他投票.

可以工作,因为JSON 几乎是Javascript对象文字表示法的一个子集.

不仅适用于散列对象,还适用于转换为相应数据类型的JSON片段的字符串,数组和整数.

<% data = { key1: 'val1', key2: 'val2' } %>
<%= javascript_tag do %>
  var data = <%= data.to_json.html_safe %>
  data.key1 === 'val1'
  data.key2 === 'val2'
<% end %>
Run Code Online (Sandbox Code Playgroud)

数据属性

向属性添加值,使用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 %>
Run Code Online (Sandbox Code Playgroud)

有时被称为"不显眼的Javascript".

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

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

的Gemfile:

gem 'gon'
Run Code Online (Sandbox Code Playgroud)

控制器:

gon.key1 = 'val1'
gon.key2 = 'val2'
Run Code Online (Sandbox Code Playgroud)

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

<html>
<head>
  <meta charset="utf-8"/>
  <%= include_gon %>
Run Code Online (Sandbox Code Playgroud)

视图:

<%= javascript_tag do %>
  gon.key1 === 'val1'
  gon.key2 === 'val2'
<% end %>
Run Code Online (Sandbox Code Playgroud)

也可以看看


Vya*_*nov 6

- 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
Run Code Online (Sandbox Code Playgroud)