-->

显示一个复选框列表,而不是多重选择(Display a checkbox list instead

2019-08-20 21:28发布

我有一个模型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_boxcheck_box_tag ,取代多个选择,并添加一些JavaScript来“检查”上check_box_tags选择值时,用户CLIC。 然后,参数将是直接在控制器中的相同。
  • 加入豆蔻代码到控制器的“适应”我的PARAMS。

有什么解决办法是少丑吗? 或者有没有其他的呢?

Answer 1:

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

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

完美的作品。



Answer 2:

还有另一种解决方案值得一提的,使得它很容易插入记录到数据库中,如果你有一个has_and_belongs_to_manyhas_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



Answer 3:

你可以像下面这样做:

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

这将使PARAMS前来服务器如下

{ :my_model => { :a => [:a_value1, :a_value2] } }


文章来源: Display a checkbox list instead of multiple select