Javascript 在js中迭代Rails控制器中的散列

Javascript 在js中迭代Rails控制器中的散列,javascript,ruby-on-rails,view,controller,haml,Javascript,Ruby On Rails,View,Controller,Haml,在我的rails控制器中,我制作了一个如下所示的散列: @data = { term => { node_id => { :name, :matchcode, :credits, :parts => [{ :mp_id, :matchcode, :nr, :selected }] }} 现在我想通过这个散列在js中迭代以获得键和值。 首先,我需要一个术语,我试着

在我的rails控制器中,我制作了一个如下所示的散列:

@data = {

 term => {        
   node_id => {
    :name,
    :matchcode,
    :credits,
    :parts => [{
      :mp_id,
      :matchcode,
      :nr,
      :selected
    }]

}}
现在我想通过这个散列在js中迭代以获得键和值。 首先,我需要一个术语,我试着用这样的词来表达:

for(var s in '#{@data}') {
   console.log(s);
}

但我似乎做错了什么——这是我第一次使用rails。

将数据从服务器端ruby控制器传递到客户端javascript代码并不是那么简单。首先,javascript不知道ruby变量,上面的代码只是字符串
“#{data}”
,它的计算结果是自身的

传递此类数据的方法有两种:

首先,您可以在DOM元素服务器端设置一个html属性,然后在javascript中读取它。在传递字符串或数字时,这可能是最简单的解决方案,但对于散列来说,这相当混乱,因为需要将其转换为javascipt可以理解的形式—转换为JSON。尽管这很简单,但它只是增加了额外的复杂性,而且很肮脏

第二种选择是宝石。它为您提供了一个对象,您可以在控制器中将数据分配给该对象。然后它处理所有转换,您可以访问javascript中的所有数据:

# controller
gon.my_data = {a: 1}

#js
gon.myData  #=> {"a": 1}
这个解决方案非常简单,但是仍然感觉有点脏


最后一个最干净、更复杂的解决方案是使用AJAX——javascript向服务器发出接收数据的请求。在许多情况下,这可能是一种过分的做法。

谢谢您提供了这个有用的答案,是否可以/建议将所有js代码翻译成haml+ruby,只使用一小部分js就可以通过haml实现迭代?