2012-08-23 27 views
1

在我的一個rails控制器中有一個數組。我想通過它的元素在相應的js.erb文件中循環。問題在於它似乎對每個元素重複兩次。這裏是代碼: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 

我的第一個問題是:爲什麼有6次迭代時@array有3個要素是什麼?
第二個問題:爲什麼getElementById的結果在null和(not null)之間交替?

+0

我覺得有一個代碼問題, 你將如何分配一個JavaScript變量的紅寶石? 'table_row = document.getElementById(「<%= element [:row_id]%>」)' – Amar

+0

Ruby在客戶端的服務器上執行javascript。他們不瞭解對方。你假設他們在同一時間執行;他們不。一個模板文件生成JS,稍後執行。它打印完全你所期望的; Ruby代碼並不關心JS條件。 –

回答

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 %>