如何将复选框表单中的多个值存储到数据库中?我已经通过各种线程搜索,仍然没有提出任何东西。主要是因为"问题"似乎总是涉及不同的部分。
为了清楚起见,这里有一个模仿我想要做的事情的例子,我不确定它的哪一部分是错误的。
所以说我们为我们的人创建了这个表
#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"]
但它没有打到数据库,任何想法为什么?
答案 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 适合以相同的形式指定其他模型对象。