帮助这个Ruby循环

时间:2011-09-15 08:43:03

标签: ruby-on-rails ruby-on-rails-3 loops

我一直盯着这个好日子,我不明白我做错了什么。 我想要生成带有复选框的活动列表,但如果其中一个活动位于users_activity表中,那么将检查该活动复选框。但是,下面的代码显示活动三次并chekcs所有框。

<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 个答案:

答案 0 :(得分:2)

检查所有复选框的原因是HTML复选框上存在checked属性会导致检查它,而不管属性的值如何。即<input type="checkbox" checked="no">会导致选中复选框。对于不应检查的复选框,您需要编写代码,使其根本没有checked属性。

您看到的复选框多于预期的原因是因为@users_activity.each循环嵌套在@Activitys.each循环中以及ifelse中如果您始终输出一个复选框,则会生成@Activitys.length * @users_activity.length复选框。

一种解决方案是在循环之外收集所有用户活动的活动ID,即

<% 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中的常量。

答案 1 :(得分:1)

  

chekcs所有方框

检查所有复选框背后的原因是您使用的是checked="no"checked="yes"。如果你在checked中写input它会检查该框,就没有这样的事情。


  

显示活动三次

这种情况正在发生,因为你在循环中有循环。因此,对于每个活动,您将为每个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

以上只是大纲。它不是任何语言的代码。