2011-09-15 67 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 

上面只是概括。这不是任何语言的代码。