2013-04-09 118 views
10

我有一个MyModel的模型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到,取代多个选择,并添加一些JavaScript来“检查”选择值,当用户对CLIC check_box_tags。然后,参数将直接在控制器中相同。
  • 在控制器中添加一个litte代码来“调整”我的参数。

什么解决方案是不那么丑陋?或者还有其他的吗?

回答

28

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

<% MyModel::AS.each do |a_value| %> 
    <%= f.check_box(:a, { :multiple => true }, a_value) %> 
<% end %> 

结果参数有点奇怪,但它应该工作。从@Viren

{"my_model" => { "a" => ["0", "a_value1", "0", "a_value2", "0"] } 

编辑:在功能的端部通过nil

<%= f.check_box(:a, { :multiple => true }, a_value, nil) %> 

完美。

+7

在末端传递'nil',它会按预期工作检查[this](http://apidock.com/rails/ActionView/Helpers/FormHelper/check_box) – Viren 2013-04-11 06:23:14

+0

@Viren感谢提示。 – pierallard 2013-04-15 06:57:11

+1

如果你愿意,请编辑你的答案,那里也有一个错字。在<%MyModel :: AS.each之后| a_value |'需要'%>'之后。只是说 – ksugiarto 2013-06-22 09:41:23

3

你可以这样说:

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

这将使PARAMS前来服务器如下

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

还有另一种解决方案值得一提的是,使得它很容易插入记录数据库,如果您有has_and_belongs_to_manyhas_manythrough关系,请使用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记录并取消选中其中一个复选框,其记录将从中删除关联表save

相关问题