2017-03-01 82 views
0

如何将多个值从复选框表单存储到数据库中?我已经搜遍了各种线索,但还没有拿出任何东西。主要是因为“问题”似乎总是涉及不同的部分。在复选框中接受多个值

为了清楚起见,这里是一个模仿我想要做什么的例子,我不知道哪部分是错的。

所以说,我们有我们的人

#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 

在控制器中,IM允许阵列

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

你为什么不分开存放业余爱好而不是数组?让Person.hobbies回报这个人的爱好会更有意义吗?特别是当你使用复选框时。这意味着你已经有了预定义的爱好。 –

+0

我并不完全认为,因为我采取这种方法的唯一原因,而不是使用'text_field'来为用户输入他们想要的任何内容,而是将其限制为选择的选项。没想到创建一个Hobby类,创造一大堆业余爱好并使用主动记录关联会“有意义”。会使用主动记录协会更好? – angkiki

+0

由于你正在使用复选框,因为你提到我以为你有一个爱好列表。如何让他们将自己的爱好打包成一个盒子,然后将其全部存储为字符串而不是数组?或者你想创建业余爱好的链接? –

回答

0

我认为问题出现在您的表单中。由于您使用,因此必须明确声明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 %> 

这里更多:http://apidock.com/rails/ActionView/Helpers/FormHelper/check_box

+0

同样的问题,我可以看到它作为一个数组传递,但它不保存到数据库...也没有回滚错误。任何想法可能的原因? – angkiki

+0

对不起,像魅力一样工作。错误是在我的部分解析参数。干杯队友:) – angkiki

+0

不客气!乐于帮助。干杯! – rbmrclo

-1

official rails documentation

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

围绕创建类似的form_for特定模型对象范围,但 不创建表单标签本身。这使得fields_for 适合以相同的形式指定其他模型对象。

+0

我明白你正试图帮助我,但这本身并不能解释我的问题的解决方案... – angkiki