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_标记和最后的复选框_标记之间的参数格式相同Passnil
,它将按预期工作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>