我一直盯着这个好日子,我不明白我做错了什么。 我想要生成带有复选框的活动列表,但如果其中一个活动位于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>
它可能非常简单,但你知道当你长时间盯着一段代码会发生什么......
答案 0 :(得分:2)
检查所有复选框的原因是HTML复选框上存在checked
属性会导致检查它,而不管属性的值如何。即<input type="checkbox" checked="no">
会导致选中复选框。对于不应检查的复选框,您需要编写代码,使其根本没有checked
属性。
您看到的复选框多于预期的原因是因为@users_activity.each
循环嵌套在@Activitys.each
循环中以及if
和else
中如果您始终输出一个复选框,则会生成@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
以上只是大纲。它不是任何语言的代码。