在 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, nil
。 nil
表示“没有隐藏的 0 输入”。这种事情的记录很差。
@NathanLong:哦,哇,太棒了。我如何将 ID [1, 2, 3]
传递为未选中但可用,就像在示例中一样?
有人可以确认:multiple => 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 的回答:当发送一个空字符串而不是 nil
或 false
作为未检查值时,Rails 将理解在更新操作中删除关联的 id:
<%= f.check_box :tag_ids, multiple: true, tag.id, '' %>
【讨论】:
以上是关于在 Rails 中,如何处理多个选中的复选框,只在 , 或?的主要内容,如果未能解决你的问题,请参考以下文章