我有一个带有序列化属性MyModel
的模型a
,描述了一系列符号。
此代码有效:
<% form_for @my_model do |f| %>
<%= f.select :a, MyModel::AS, :multiple => true) %>
<% end %>
参数正确:
{ :my_model => { :a => [:a_value1, :a_value2] } }
我想将这个多重选择转换为一组复选框,如下所示:
<% form_for @my_model do |f| %>
<% MyModel::AS.each do |a_value|
<%= f.check_box(:a_value) %>
<% end %>
<% end %>
它也有效,但参数完全不同:
{ :my_model => { :a_value1 => 1, :a_value2 => 1 } }
我想到2个解决方案可以回到第一个解决方案......
check_box
转换为check_box_tag
,替换多个select,并在check_box_tags上的用户clic时添加一些javascript以“检查”选择值。然后,参数将直接在控制器中相同。什么解决方案不那么难看?或者还有其他人吗?
答案 0 :(得分:32)
我找到了一个解决方案,使用了我不知道的'multiple'选项。
<% MyModel::AS.each do |a_value| %>
<%= f.check_box(:a, { :multiple => true }, a_value) %>
<% end %>
结果参数有点奇怪,但它应该有用。
{"my_model" => { "a" => ["0", "a_value1", "0", "a_value2", "0"] }
从@Viren编辑:在函数末尾传递nil
,如
<%= f.check_box(:a, { :multiple => true }, a_value, nil) %>
完美无缺。
答案 1 :(得分:4)
还有另一个值得一提的解决方案,如果您使用has_and_belongs_to_many
表单建立has_many
或through
collection_check_boxes
关系,则可以很容易地将记录插入数据库帮手。 See documentation here.
<%= f.collection_check_boxes :mymodel_ids, MyModel::AS, :id, :name do |m| %>
<%= m.check_box %> <%= m.label %>
<% end %>
然后,在控制器中我们将允许mymodel_ids
属性:
params.require(:mymodel).permit(:name, mymodel_ids:[])
我们还可以设置模型验证,要求至少选中一个复选框:
validates :mymodel_ids, presence: true
此方法的另一个好处是,如果您稍后编辑mymodel
记录并取消选中其中一个复选框,则其记录将从many_to_many
上的save
关联表中删除。
答案 2 :(得分:3)
你可以这样做:
<% MyModel::AS.each do |a_value| %>
<%= f.check_box("a[]", a_value) %>
<% end %>
这将使params到服务器如下
{ :my_model => { :a => [:a_value1, :a_value2] } }
答案 3 :(得分:0)
如果您已经有一个select_tag
<%= select_tag "filters", options_from_collection_for_select(filter_values, "id", "name", selected_ids), multiple:true, class:"form-control" %>
并想用check_box_tag替换它,您将需要执行以下操作:
<div class="checkbox-inline">
<%= check_box_tag "filters[]", value.id, selected_ids.include?(value.id), { :multiple => true} %>
<%= value.name %>
</div>
请注意,要捕获复选框所需名称的末尾方括号会产生相同的参数。
实施此操作时,select_tag和check_box_tag之间的参数格式相同