在 Rails 中,如何处理多个选中的复选框,只在 , 或?

Posted

技术标签:

【中文标题】在 Rails 中,如何处理多个选中的复选框,只在 , 或?【英文标题】:In Rails, how to handle multiple checked checkboxes, just split on the , or? 【发布时间】:2011-05-24 10:26:45 【问题描述】:

很好奇当用户选中多个复选框(具有相同的名称值)并将其发送回控制器时处理这种情况的“rails 方式”是什么。

您将如何检查是否选择了多个项目,然后根据 ID 值等进行拆分。

【问题讨论】:

【参考方案1】:

最简单的方法是将这些复选框设置为一个数组。

html

<input type="checkbox" name="tag_ids[]" value="1" />
<input type="checkbox" name="tag_ids[]" value="2" />
<input type="checkbox" name="tag_ids[]" value="3" />

控制器:

tag_ids = params[:tag_ids]

(当然,您可能会在视图中使用基于form_for 的助手,因此会大量分配标签ID。这只是最通用的示例。)

【讨论】:

如果用户取消选中一个复选框会发生什么? tag_ids[] 会作为空数组提交吗? @Joe Van Dyk:如果在 HTTP 请求中没有提交名为 tag_ids[] 的值,那么 Rails 不会考虑将 tag_ids 放入 params。您必须自己考虑这一点,例如,params[:tag_ids] ||= [] 要获取此 HTML,您可以使用 f.check_box :tag_ids, multiple: true, 1, nilnil 表示“没有隐藏的 0 输入”。这种事情的记录很差。 @NathanLong:哦,哇,太棒了。我如何将 ID [1, 2, 3] 传递为未选中但可用,就像在示例中一样? 有人可以确认:multiple =&gt; true 在 3.2.11 中有效吗?我无法在name 的末尾获得[],因此这些值根本不会作为数组提交。【参考方案2】:

如果你想使用 checked 参数,你必须这样写:

check_box_tag "tag_ids[]", 1, true

不是这个:

check_box_tag 'tag_ids[]', 1, true

我花了一段时间才弄清楚,我希望它能帮助别人。

【讨论】:

所以您是说单引号 ' 与双引号 `"" 在这里有所不同?【参考方案3】:
f.check_box :tag_ids, multiple: true, 1, nil

是正确的答案:

这就是原因,有一个 'multiple: true' 选项可以让你的输入被放置在一个数组中。如果没有 multiple: true 选项,则不允许这样做。

【讨论】:

我知道这有点晚了,但最后的 nil 是干什么用的? nil 表示“没有隐藏的 0 输入”。【参考方案4】:

这是一个视图和控制器示例,例如多个清洁工可以在多个城市。

<%= form_for(@cleaner) do |f| %>
  <p>
    <%= f.label :cities %><br />
    <% for city in City.all %>
      <%= check_box_tag "cleaner[city_ids][]", city.id, @cleaner.cities.include?(city) %>
      <%=h city.name %><br />
    <% end %>
  </p>
  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>

在控制器中

def cleaner_params
  params.require(:cleaner).permit(city_ids: [])
end

你可以找到关于“rails way”的完整教程https://kolosek.com/rails-join-table/

【讨论】:

Nesha 这是完美的解决方案。谢谢你。你真棒【参考方案5】:

除了 Chuck Callebs 的回答:当发送一个空字符串而不是 nilfalse 作为未检查值时,Rails 将理解在更新操作中删除关联的 id:

&lt;%= f.check_box :tag_ids, multiple: true, tag.id, '' %&gt;

【讨论】:

以上是关于在 Rails 中,如何处理多个选中的复选框,只在 , 或?的主要内容,如果未能解决你的问题,请参考以下文章

如何处理带有不确定复选框的浏览器差异

django MultiValueDictKeyError 错误,我该如何处理

Blazor 处理复选框切换

reactjs 如何处理一个组件中的多个单选按钮组?

如何处理数据表中的复选框单击事件

如何处理Rails加入表关系删除?