嵌套形式的HABTM复选框
我试图在嵌套形式实现HABTM复选框。嵌套形式的HABTM复选框
目前,我有3个模型。主题,课程和小组。 协会如下: 每个科目都有很多课程。 每节课都有,属于很多组。
现在,我试图在一个创建和编辑窗体上实现它们。 这样一个课程嵌套在主题中,每个课程都有一个用于实现HABTM关系的组复选框列表。
由于每个科目都有很多课程,所以我在实施HABTM关系时遇到了麻烦,我不知道如何区分不同的课程。
为了进一步阐述,我能够获得嵌套表单的工作,但我不能让HABTM复选框保存到正确的教训。 以下代码示例是我的HABTM复选框实现。
<% Group.all.each do |group|%>
<%= check_box_tag "subject[lessons_attributes[0]][group_ids][]", group.id, f.object.groups.include?(group) %>
<%= group.group_index %>
<%end%>
目前,我一直在使用这一行 “主题[lessons_attributes [0] [group_ids] []” 它保存到的第一课。
然而,教训数量而变化,我也不太清楚,我怎么能确定的教训“数字”,即在“主题[lessons_attributes [] [group_ids] []”的粗体0。这样我可以将小组保存到正确的课程中。
任何意见,将不胜感激。
最好的做法是在主题上预先建立(一些)课程对象(即form.object),然后遍历它们以获得每个课程的字段。 如果使用simple_form或formtastic,收集通过复选框选择很简单:
<% form_for @subject do |form| %>
....
<% form.fields_for :lessons do |lesson_form| %>
...
<% lesson_form.input :group_ids, :as => :check_boxes %>
,如果你想使用,你应该通过经验与索引迭代,并在您的复选框名称来替代指数:
<% form_for @subject do |form| %>
....
<% @subject.lessons.each_with_index do |l, i| %>
<% Group.all.each do |group|%>
<%= check_box_tag "subject[lessons_attributes[#{i}]][group_ids][]", group.id, l.groups.include?(group) %>
<%= group.group_index %>
<% end %>
非常感谢,让我试试看。 – 2013-02-14 16:49:21
得到它与第二种方法一起工作,并参考这个问题来实现索引的rails字段。 http://stackoverflow.com/questions/4853373/rails-fields-for-with-index。我将来可能会考虑使用简单的表单。再次感谢! – 2013-02-14 18:20:55
为什么复选框名称末尾的'[]'? – Maarten 2013-11-26 10:10:16
对于那些与轨道4的工作,并具有相同的问题(如我不得不)
的Group.all.each
循环@Viktor Trón的答案是不必要的: 有一个新的FormBuilder方法,collection_check_boxes,它已经为此创建!
您的代码将是:
<% form_for @subject do |form| %>
....
<% @subject.lessons.each_with_index do |l, i| %>
<%= form.fields_for :lessons, l do |lesson_fields|%>
<%= lesson_fields.collection_check_boxes :group_ids, Group.all, :id, :group_index %>
<% end %>
<% end %>
<% end %>
然后,您必须添加accepts_nested_attributes_for :lessons
您Subject
模型,并在您SubjectsController
,改变subject_params
法 “允许” 嵌套params用于在教训:
params.require(:subject).permit(..., lessons_attributes: [:id, group_ids: []])
在您的SubjectsController
中,create
或update
的操作保持不变:例如@subject = Subject.create(subject_params)
,将创建Subject,关联课程并正确更新他们的HABTM关系(除非我在某个地方犯了错误!)。
只是为了澄清,你想每个课程的复选框单独列表权利? – 2013-02-14 16:20:20
是的,但是课程嵌套在主题中,我不知道如何获得它将发送的号码。 – 2013-02-14 16:35:23