在复选框中接受多个值
问题描述:
如何将多个值从复选框表单存储到数据库中?我已经搜遍了各种线索,但还没有拿出任何东西。主要是因为“问题”似乎总是涉及不同的部分。在复选框中接受多个值
为了清楚起见,这里是一个模仿我想要做什么的例子,我不知道哪部分是错的。
所以说,我们有我们的人
#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"]
但是它没有打到数据库,有什么想法?
答
我认为问题出现在您的表单中。由于您使用,因此必须明确声明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
答
fields_for(record_name, record_object = nil, options = {}, &block)
围绕创建类似的form_for特定模型对象范围,但 不创建表单标签本身。这使得fields_for 适合以相同的形式指定其他模型对象。
+0
我明白你正试图帮助我,但这本身并不能解释我的问题的解决方案... – angkiki
你为什么不分开存放业余爱好而不是数组?让Person.hobbies回报这个人的爱好会更有意义吗?特别是当你使用复选框时。这意味着你已经有了预定义的爱好。 –
我并不完全认为,因为我采取这种方法的唯一原因,而不是使用'text_field'来为用户输入他们想要的任何内容,而是将其限制为选择的选项。没想到创建一个Hobby类,创造一大堆业余爱好并使用主动记录关联会“有意义”。会使用主动记录协会更好? – angkiki
由于你正在使用复选框,因为你提到我以为你有一个爱好列表。如何让他们将自己的爱好打包成一个盒子,然后将其全部存储为字符串而不是数组?或者你想创建业余爱好的链接? –