在复选框中接受多个值

时间:2017-03-01 07:56:01

标签: ruby-on-rails

如何将复选框表单中的多个值存储到数据库中?我已经通过各种线程搜索,仍然没有提出任何东西。主要是因为"问题"似乎总是涉及不同的部分。

为了清楚起见,这里有一个模仿我想要做的事情的例子,我不确定它的哪一部分是错误的。

所以说我们为我们的人创建了这个表

#schema.rb
create_table "persons", force: :cascade do |t|
  t.string  "hobby", default: [], array: true
end

在模型中

#person.rb
serialize :hobby

因此,如果说我有一个带有复选框的表单,让用户选择他最喜欢的爱好。例如,因为这个爱好列表真的很长,我将值存储在一个模块中。

#app/models/concerns/hobby_data.rb
module HobbyData
  Activities = [
    item_one,
    item_two,
    ...
  ]
end

在控制器中,我允许一个数组

params.require(:person).permit({:hobby => []})

以我的形式

#form for new/edit person

<% form_for @person do |f| %>
#other fields
<% HobbyData::Activities.each do |activity| %>
  <%= check_box_tag("hobby[]", activity) %>
  <%= activity %> #for the activity name
<% end %>

我现在可以看到从日志中传入的值

hobby => ["item_one", "item_two"]

但它没有打到数据库,任何想法为什么?

2 个答案:

答案 0 :(得分:0)

我认为问题出在你的身上。由于您使用的是check_box_tag,因此必须显式声明hobby[]属性所属的范围。所以你的表格应该是这样的:

<% form_for @person do |f| %>
  <% HobbyData::Activities.each do |activity| %>
    <%= check_box_tag("person[hobby][]", activity) %> <-- notice this change
    <%= activity %> #for the activity name
  <% end %>
<% end %>

另一方面,还有一个表单助手,所以你可以这样做......

<% form_for @person do |f| %>
  <% HobbyData::Activities.each do |activity| %>
    <%= f.check_box :hobby, { multiple: true }, activity, nil %>
  <% end %>
<% end %>

更多信息:jQuery ajax

答案 1 :(得分:-1)

来自 official rails documentation

 fields_for(record_name, record_object = nil, options = {}, &block) 
  

围绕特定模型对象(如form_for)创建范围   不会自己创建表单标记。这使得fields_for   适合以相同的形式指定其他模型对象。