11

我有一个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 } }

我想了两个解决方案来返回第一个解决方案......

  • 当用户点击 check_box_tags 时,将mycheck_box转换为、替换多项选择并添加一些 javascript 以“检查”选择值。check_box_tag然后,参数将直接在控制器中相同。
  • 在控制器中添加一个小代码以“调整”我的参数。

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

4

4 回答 4

34

我找到了一个解决方案,使用我不知道的“多个”选项。

<% 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) %>

完美运行。

于 2013-04-09T13:24:40.410 回答
6

has_and_belongs_to_many还有一个值得一提的解决方案,如果你有一个orhas_many through关系,它可以很容易地使用collection_check_boxes表单助手将记录插入到数据库中。请参阅此处的文档。

<%= 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

于 2016-05-04T18:20:00.803 回答
3

你可以这样做:

<% MyModel::AS.each do |a_value| %>
  <%= f.check_box("a[]", a_value) %>  
<% end %>

这将使参数如下到达服务器

{ :my_model => { :a => [:a_value1, :a_value2] } }
于 2015-02-11T20:27:38.090 回答
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 之间的参数格式相同

于 2019-11-28T19:03:13.687 回答