显示复选框列表而不是多个选择
我有一个带有序列化属性a
的模型MyModel
,描述了一个符号数组。
此代码有效:
true) %>
参数是正确的:
{ :my_model => { :a => [:a_value1, :a_value2] } }
我想将这个多选项转换为一组复选框,如下所示:
<% MyModel::AS.each do |a_value|
它也有效,但参数完全不同:
{ :my_model => { :a_value1 => 1, :a_value2 => 1 } }
我想到2个解决方案可以回到第一个解决方案……
- 将我的
check_box
转换为check_box_tag
,替换多个select,并在check_box_tags上的用户clic时添加一些javascript以“检查”选择值。 然后,参数将直接在控制器中相同。 - 在控制器中添加一个小代码,以“调整”我的参数。
什么解决方案不那么难看? 或者还有其他的吗?
我找到了一个解决方案,使用了我不知道的“多个”选项。
<% 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) %>
工作得很好。
你可以这样做:
<% MyModel::AS.each do |a_value| %> <%= f.check_box("a[]", a_value) %> <% end %>
这将使params如下所示进入服务器
{ :my_model => { :a => [:a_value1, :a_value2] } }
还有另一个值得一提的解决方案,如果您通过使用collection_check_boxes
表单帮助程序具有has_and_belongs_to_many
或has_many
关系,则可以非常轻松地将记录插入到数据库中。
<%= 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:[])
我们还可以设置模型validation,以至少要检查其中一个复选框:
validates :mymodel_ids, presence: true
此方法的另一个好处是,如果您稍后编辑mymodel
记录并取消选中其中一个复选框,则其记录将在save
从many_to_many
关联表中删除。