5

我试图在嵌套形式实现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。这样我可以将小组保存到正确的课程中。

任何意见,将不胜感激。

+1

只是为了澄清,你想每个课程的复选框单独列表权利? – 2013-02-14 16:20:20

+0

是的,但是课程嵌套在主题中,我不知道如何获得它将发送的号码。 – 2013-02-14 16:35:23

回答

5

最好的做法是在主题上预先建立(一些)课程对象(即form.object),然后遍历它们以获得每个课程的字段。 如果使用simple_formformtastic,收集通过复选框选择很简单:

<% 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 %> 
+0

非常感谢,让我试试看。 – 2013-02-14 16:49:21

+1

得到它与第二种方法一起工作,并参考这个问题来实现索引的rails字段。 http://stackoverflow.com/questions/4853373/rails-fields-for-with-index。我将来可能会考虑使用简单的表单。再次感谢! – 2013-02-14 18:20:55

+1

为什么复选框名称末尾的'[]'? – Maarten 2013-11-26 10:10:16

8

对于那些与轨道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 :lessonsSubject模型,并在您SubjectsController,改变subject_params法 “允许” 嵌套params用于在教训:

params.require(:subject).permit(..., lessons_attributes: [:id, group_ids: []]) 

在您的SubjectsController中,createupdate的操作保持不变:例如@subject = Subject.create(subject_params),将创建Subject,关联课程并正确更新他们的HABTM关系(除非我在某个地方犯了错误!)。