我有一个模型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
,取代多个选择,并添加一些JavaScript来“检查”上check_box_tags选择值时,用户CLIC。 然后,参数将是直接在控制器中的相同。 - 加入豆蔻代码到控制器的“适应”我的PARAMS。
有什么解决办法是少丑吗? 或者有没有其他的呢?
我发现了一个解决方案,使用“多”的选项,我不知道。
<% 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) %>
完美的作品。
还有另一种解决方案值得一提的,使得它很容易插入记录到数据库中,如果你有一个has_and_belongs_to_many
或has_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
。
你可以像下面这样做:
<% MyModel::AS.each do |a_value| %>
<%= f.check_box("a[]", a_value) %>
<% end %>
这将使PARAMS前来服务器如下
{ :my_model => { :a => [:a_value1, :a_value2] } }