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

时间:2013-04-09 10:31:59

标签: ruby-on-rails ruby-on-rails-2

我有一个带有序列化属性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以“检查”选择值。然后,参数将直接在控制器中相同。
  • 在控制器中添加一个小代码,以“调整”我的参数。

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

4 个答案:

答案 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_manythrough 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之间的参数格式相同