显示复选框列表而不是多个选择

我有一个带有序列化属性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_manyhas_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记录并取消选中其中一个复选框,则其记录将在savemany_to_many关联表中删除。