2011-09-15 96 views
2

我一直在盯着這一個美好的一天,我不明白什麼是做錯了。 我想要這個產生一個帶有複選框的活動列表,但是如果其中一個活動在users_activity表中,那麼那個活動複選框將被選中。但是,下面的代碼會顯示活動三次,並顯示所有框。幫助這個Ruby循環

<fieldset> 
    <table> 
     <tr> 
      <th>Activity ID</th> 
      <th>Activity Name</th> 
     </tr> 
     <% @Activitys.each do |activity| %> 
      <% @users_activity.each do |ua| %> 
       <% if activity.id == ua.activity_id %> 
       <tr> 
        <td><%= activity.id %></td> 
        <td><%= activity.activity_name%></td> 
        <td><input name="check_<%= activity.id %>" type="checkbox" checked="yes"></td> 
       </tr> 
       <% else %> 
       <tr> 
        <td><%= activity.id %></td> 
        <td><%= activity.activity_name%></td> 
        <td><input name="check_<%= activity.id %>" type="checkbox" checked="no"></td> 
       </tr> 
       <% end %> 
      <% end %> 
     <% end %> 
    </table> 
</fieldset> 

它可能真的很容易,但你知道,當你盯着一段代碼太久會發生什麼......

回答

2

所有的複選框被選中的原因是checked的存在屬性上HTML複選框會導致它被檢查,而不管屬性的值如何。即<input type="checkbox" checked="no">導致選中的複選框。對於不應該檢查的複選框,您需要編寫代碼,使其完全沒有checked屬性。

比你期望你看到更多的複選框的原因是因爲你有你的嵌套循環@Activitys.each@users_activity.each循環,同時在if,你總是輸出複選框,以便這導致@Activitys.length * @users_activity.length複選框的else情況。

一種解決辦法是收集所有用戶的活動,一旦外面的循環,即

<% user_activity_ids = @users_activity.collect { |ua| ua.activity_id } %> 

(你也可以這樣移動到控制器)

然後剛剛在@Activitys.each循環的活動編號您生成的東西複選框像

<input name="check_<%= activity.id %>" type="checkbox" 
    <%=' checked="yes"' if user_activity_ids.include? activity.id %>> 

另外,@Activitys應該被稱爲@activities,因爲以大寫字母開頭的變量名錶示它是Ruby中的常量。

+0

感謝兄弟..謝謝你的提示關於大寫字母,生病記得現在 – SD1990

1

chekcs所有的箱子

檢查所有複選框背後的原因是您正在使用checked="no"checked="yes"。有沒有這樣的事情,如果你寫checkedinput它將檢查該框。


顯示活動三次

發生這種情況,因爲你有一個循環內循環。因此,對於每項活動,您都會爲每個users_activity打印一個<tr>。我所說的是每個活動都是打印users_activity次數。創建一個單獨的邏輯來檢查activity.id是否等於ua.activityId對於任何用戶,並在該邏輯中返回true/false。我不是RoR專家,所以我不能爲此展示。但是,這可能是邏輯:

for each activity do 
    print activity.Id 
    print activity.Name 
    if(checkInUsersActivity(activity.id)) 
     print checked check box 
    else 
     print unchecked check box 
end 

function checkInUsersActivity(activityId) returns boolean 
    for each users_activity do 
     if(ua.activitId == activityId) 
     return true; 
    return false 
end 

上面只是概括。這不是任何語言的代碼。