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關係(除非我在某個地方犯了錯誤!)。