5

Próbuję zaimplementować pole wyboru HABTM w formie zagnieżdżonej.Pole wyboru HABTM w formie zagnieżdżonej

Obecnie mam 3 modele. Przedmiot, lekcja i grupy. Stowarzyszenia są następujące: Każdy przedmiot ma wiele lekcji. Każda lekcja należy i należy do wielu grup.

W tej chwili próbuję je wszystkie zaimplementować w jednym formularzu tworzenia i edycji. Takie, że lekcja jest zagnieżdżona w temacie i dla każdej lekcji znajduje się lista pól wyboru grupy do implementacji relacji HABTM.

Mam problemy z wdrażaniem relacji HABTM, ponieważ istnieje wiele lekcji na przedmioty i nie jestem pewien, w jaki sposób mogłem rozróżnić poszczególne lekcje.

Aby dopracować dalej, jestem w stanie uzyskać działanie formularza zagnieżdżonego, ale nie mogę uzyskać pól wyboru HABTM, aby zapisać odpowiednie lekcje. Poniższy przykładowy kod jest moją implementacją pola wyboru 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%> 

Obecnie mam zapisany na pierwszej lekcji za pomocą tej linii "temat [lessons_attributes [0]] [group_ids] []".

Jednak liczba lekcji zmieniać i nie jestem zbyt pewien, jak mogę określić lekcji "numer", to znaczy pogrubione 0 w "temat [lessons_attributes []] [group_ids] []". Tak, że mógłbym zapisać grupy na właściwej lekcji.

Każda rada byłaby doceniona.

+1

aby wyjaśnić, chcesz osobną listę pól wyboru dla każdej lekcji, prawda? –

+0

tak, ale lekcja jest zagnieżdżona w temacie i nie jestem pewna, w jaki sposób mógłbym uzyskać numer, do którego zostanie wysłana. –

Odpowiedz

5

Najlepszą praktyką jest budowanie (kilka) obiektów lekcji na ten temat (to jest form.obiekt), a następnie iteracje nad nimi, aby mieć pola dla poszczególnych lekcji. jeśli używasz simple_form lub formtastic, kolekcja wybrać poprzez wyboru jest proste:

<% form_for @subject do |form| %> 
    .... 
    <% form.fields_for :lessons do |lesson_form| %> 
    ... 
    <% lesson_form.input :group_ids, :as => :check_boxes %> 

jeśli chcesz korzystanie należy iterację lekcji z indeksem i zastąpić indeks w nazwie checkbox:

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

Dziękuję bardzo, pozwól mi to wypróbować. –

+1

Gotowy do pracy z drugą metodą i w odniesieniu do tego pytania na temat implementacji pól szyn z indeksem. http://stackoverflow.com/questions/4853373/rails-fields-for-with-index. Być może zajrzę do zastosowania prostej formy w przyszłości. Jeszcze raz dziękuję! –

+1

Dlaczego '[]' na końcu nazwy pola wyboru? – Maarten

8

osób pracujących z szyn 4 i ma te same pytania (jak w przeszłości)

Pętlaw odpowiedzi @Viktor Trón jest niepotrzebna: Istnieje nowa metoda FormBuilder, collection_check_boxes, która została stworzona właśnie do tego!

Twój kod byłoby:

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

Następnie trzeba dodać accepts_nested_attributes_for :lessons do modelu Subject, aw swojej SubjectsController zmień metodę subject_params do "pozwolenie" zagnieżdżone params dla lekcji:

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

W przypadku operacji SubjectsController akcje pozostają niezmienione: na przykład @subject = Subject.create(subject_params) utworzy obiekt, powiązane lekcje i poprawnie zaktualizuj swoje relacje HABTM do grup (chyba że gdzieś się pomyliłem!).