gpt4 book ai didi

ruby-on-rails - 帮助解决这个 Ruby 循环

转载 作者:行者123 更新时间:2023-12-04 06:14:28 24 4
gpt4 key购买 nike

我一直盯着这个好一天,我不明白我做错了什么。
我希望它生成一个带有复选框的事件列表,但如果其中一个事件在 users_activity 表中,那么该事件复选框将被选中。但是,下面的代码显示了 3 次事件并检查了所有框。

<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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com