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

Iterate through a hash from the Rails controller in 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。尽管做起来很简单,但它只会增加额外的复杂性,而且很脏。

第二个选项是 gon gem。它为您提供了一个对象,您可以在控制器中为其分配数据。然后它处理所有转换,您可以访问 javascript:

中的所有数据
# controller
gon.my_data = {a: 1}

#js
gon.myData  #=> {"a": 1}

这个解决方案很简单,但是感觉还是有点脏。

最终、最干净和更复杂的解决方案是使用 AJAX - 您的 javascript 向您的服务器发出请求以接收数据。在许多情况下可能有点矫枉过正。