js.erb文件中的循环迭代次数是它应该的两倍

时间:2012-08-23 10:24:32

标签: javascript ruby-on-rails

我的一个rails控制器中有一个数组。我想在相应的js.erb文件中循环遍历其元素。问题是它似乎每个元素迭代两次。这是代码:

<% @array.each do |element| %>
    table_row = document.getElementById("<%= element[:row_id]%>")
    if (table_row != null)
    {
        <% p "row found:" %>
        <% p element[:row_id] %>
    }
    else
    {
        <% p "row not found:" %>
        <% p element[:row_id] %>
    }
<% end %>

让我们说@array有3个元素。然后上面的代码会产生一个非常奇怪的输出:

row found:
1
row not found:
1
row found:
2
row not found:
2
row found:
3
row not found:
3

我的第一个问题是:当@array有3个元素时,为什么会有6次迭代? 第二个问题:为什么getElementById的结果在null和(非null)之间交替?

1 个答案:

答案 0 :(得分:1)

问题很可能是内部代码是ruby,无论js代码中的if条件如何,都会执行该代码。通过使用p,您可以告诉ruby将这些行打印到服务器控制台,因为js只能在客户端执行,所以没有机会向服务器控制台添加任何内容。

基本上你做了两件事:首先你生成一个包含空块的条件的js,然后在那个期间你将一些行打印到rails服务器控制台。你不能混合这样的东西。使用这样的东西,看看:

<% @array.each do |element| %>
    table_row = document.getElementById("<%= element[:row_id]%>")
    if (table_row != null)
    {
        alert("row found: <%= element[:row_id] %>");
    }
    else
    {
        alert("row not found: <%= element[:row_id] %>");
    }
<% end %>