我已经盯着这个看了好一天了,我不明白我做错了什么。 我希望生成带有复选框的事件列表,但如果其中一项事件位于 users_activity 表中,则将选中该事件复选框。然而,下面的代码显示该事件三次并检查所有框。
<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>
这可能真的很简单,但你知道当你盯着一段代码太久会发生什么......
最佳答案
选中所有复选框的原因是 checked
的存在HTML 复选框上的属性会导致选中该复选框,而不管该属性的值如何。即<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 } %>
(您也可以将其移至 Controller )
然后就只有 @Activitys.each
循环中生成带有类似内容的复选框
<input name="check_<%= activity.id %>" type="checkbox"
<%=' checked="yes"' if user_activity_ids.include? activity.id %>>
此外,@Activitys
可能应该被称为 @activities
因为变量名以大写字母开头表示它是 Ruby 中的常量。
关于ruby-on-rails - 帮助解决这个 Ruby 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7428119/