我正在尝试以嵌套的形式实现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%>
目前,我已使用此行“subject [lessons_attributes [0]] [group_ids] []”将其保存到第一课。
然而,课程数量各不相同,我不太确定如何确定课程“数字”,即“主题[lesson_attributes [ 0 ]] [group_ids]中的粗体0 [ ]”。这样我就可以将小组保存到正确的课程中。
任何建议都将受到赞赏。
答案 0 :(得分:9)
对于使用Rails 4并且具有相同问题的人(就像我一样)
@Viktor Trón的答案中的Group.all.each
循环是不必要的:
有一个新的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.require(:subject).permit(..., lessons_attributes: [:id, group_ids: []])
在SubjectsController
中,create
或update
操作保持不变:例如,@subject = Subject.create(subject_params)
将创建主题,相关课程并将其HABTM关系更新为群组正确的(除非我在某个地方犯了错误!)。
答案 1 :(得分:5)
最佳做法是预先构建(一些)主题上的课程对象(即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 %>
如果您想使用check_box_tag
,您应该使用索引迭代课程并替换复选框名称中的索引:
<% 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 %>