Ruby on rails 显示复选框列表,而不是多个选择

Ruby on rails 显示复选框列表,而不是多个选择,ruby-on-rails,ruby-on-rails-2,Ruby On Rails,Ruby On Rails 2,我有一个模型MyModel,它具有一个序列化属性a,描述一个符号数组 此代码适用于: <% form_for @my_model do |f| %> <%= f.select :a, MyModel::AS, :multiple => true) %> <% end %> 我想将此多重选择转换为一组复选框,如下所示: <% form_for @my_model do |f| %> <% MyModel::AS.each do

我有一个模型
MyModel
,它具有一个序列化属性
a
,描述一个符号数组

此代码适用于:

<% form_for @my_model do |f| %>
  <%= f.select :a, MyModel::AS, :multiple => true) %>
<% end %>
我想将此多重选择转换为一组复选框,如下所示:

<% form_for @my_model do |f| %>
  <% MyModel::AS.each do |a_value|
    <%= f.check_box(:a_value) %>
  <% end %>
<% end %>
我想有两个解决方案返回到第一个解决方案

  • 将我的
    复选框
    转换为
    复选框标签
    ,替换多个选择,并在用户点击复选框标签时添加一些javascript来“检查”选择值。然后,控制器中的参数将直接相同
  • 在控制器中添加一个小代码,用于“调整”我的参数

什么样的解决方案不那么难看?或者还有其他解决方案吗?

我找到了一个解决方案,使用了我不知道的“多个”选项

<% MyModel::AS.each do |a_value| %>
  <%= f.check_box(:a, { :multiple => true }, a_value) %>
<% end %>
从@Viren编辑:在函数末尾传递
nil
,如

  <%= f.check_box(:a, { :multiple => true }, a_value, nil) %>
true},a_值,nil)%>

工作正常。

您可以这样做:

<% MyModel::AS.each do |a_value| %>
  <%= f.check_box("a[]", a_value) %>  
<% end %>
<div class="checkbox-inline">
    <%= check_box_tag "filters[]", value.id, selected_ids.include?(value.id), { :multiple => true} %>
    <%= value.name %>
</div>

另一个值得一提的解决方案是,如果您有一个
has\u和\u属于\u many
has\u many
,通过使用
collection\u复选框的
关系,可以非常轻松地将记录插入数据库

我们还可以设置模型验证,要求至少选中一个复选框:

validates :mymodel_ids, presence: true

此方法的另一个好处是,如果您稍后编辑
mymodel
记录并取消选中其中一个复选框,则如果您已经有一个select标记,则其记录将从
save

上的
many-to-many
关联表中删除

<%= select_tag "filters", options_from_collection_for_select(filter_values, "id", "name", selected_ids), multiple:true, class:"form-control" %>

如果要用check_box_标记替换它,则需要实现如下内容:

<% MyModel::AS.each do |a_value| %>
  <%= f.check_box("a[]", a_value) %>  
<% end %>
<div class="checkbox-inline">
    <%= check_box_tag "filters[]", value.id, selected_ids.include?(value.id), { :multiple => true} %>
    <%= value.name %>
</div>

真}%>
请注意,名称上的结束括号是捕获复选框结果所需的括号,它将导致相同的参数


当我实现此功能时,select_标记和最后的复选框_标记之间的参数格式相同

Pass
nil
,它将按预期工作check@Viren谢谢提示。如果需要,请编辑您的答案,那里还有一个打字错误。在
之后。我个人的看法是:这是定义用户角色的一个很好的方法。这样,角色定义是硬编码的,您不需要任何额外的联接或查询来从数据库中获取其他数据,因为这些数据都在序列化字段中。令人惊叹的!这在指南里吗?我什么也找不到。你能给我链接吗?谢谢@Metaphysiker,这里有一个指向文档的链接:
presence
验证是否可以正确使用此选项?还是因为<代码> CopyTyPosithCuxBox 包含一个空字符串,即使没有检查复选框,验证也会通过吗?@ TravisSmith,存在验证肯定是有效的,因为Rails将空字符串当作空白输入,并且不考虑它存在。
params.require(:mymodel).permit(:name, mymodel_ids:[])
validates :mymodel_ids, presence: true
<%= select_tag "filters", options_from_collection_for_select(filter_values, "id", "name", selected_ids), multiple:true, class:"form-control" %>
<div class="checkbox-inline">
    <%= check_box_tag "filters[]", value.id, selected_ids.include?(value.id), { :multiple => true} %>
    <%= value.name %>
</div>