5

Ich versuche, ein HABTM-Kontrollkästchen in einer verschachtelten Form zu implementieren.HABTM-Kontrollkästchen in verschachtelter Form

Derzeit habe ich 3 Modelle. Thema, Lektion und Gruppen. Die Assoziationen sind wie folgt: Jedes Fach hat viele Lektionen. Jede Lektion hat und gehört zu vielen Gruppen.

Momentan versuche ich, sie alle in einem einzigen Erstellungs- und Bearbeitungsformular zu implementieren. So dass eine Lektion in den Betreff geschachtelt ist und für jede Lektion gibt es eine Liste von Gruppen Kontrollkästchen um die HABTM Beziehung zu implementieren.

Ich stehe vor Schwierigkeiten bei der Umsetzung der HABTM-Beziehung, da es viele Fächer pro Thema gibt und ich nicht sicher bin, wie ich zwischen den verschiedenen Lektionen unterscheiden könnte.

Um weiter zu gehen, ich bin in der Lage, die verschachtelte Form zu arbeiten, aber ich kann nicht die HABTM-Checkboxen in den richtigen Unterricht zu speichern. Das folgende Codebeispiel ist meine HABTM-Checkbox-Implementierung.

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

Derzeit habe ich es in der ersten Lektion mit dieser Zeile "Betreff [lessons_attributes [0]] [GROUP_IDs] []" gespeichert.

jedoch die Anzahl der Unterrichtsstunden variiert, und ich bin nicht sicher, wie ich konnte die Lektion "Nummer", das heißt der bolded 0 in "Betreff [lessons_attributes []] [GROUP_IDs] []" bestimmen. So dass ich die Gruppen in der richtigen Lektion speichern konnte.

Jeder Rat würde geschätzt werden.

+1

nur um zu verdeutlichen, wollen Sie eine separate Liste von Kontrollkästchen für jede Lektion richtig? –

+0

ja, aber die Lektion ist in das Thema verschachtelt und ich bin mir nicht sicher, wie ich die Nummer bekommen könnte, an die es gesendet werden würde. –

Antwort

5

Die beste Vorgehensweise besteht darin, (einige) Unterrichtsobjekte für das Thema (dh das form.object) zu erstellen, dann iterieren Sie über sie, um Felder pro Lektion zu erhalten. wenn Sie simple_form oder formtastic, Sammlung verwenden über Kontrollkästchen wählen ist einfach:

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

wenn Sie wollen, verwenden , Sie durch Unterricht mit einem Index und ersetzen Sie den Index in der Checkbox Namen iterieren sollte:

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

Vielen Dank, lass es mich ausprobieren. –

+1

Hat es funktioniert mit der zweiten Methode und mit Bezug auf diese Frage zur Implementierung von Schienen Felder für mit Index. http://stackoverflow.com/questions/4853373/rails-fields-for-with-index. Ich würde vielleicht in Zukunft mit einfacher Form arbeiten. Noch einmal vielen Dank! –

+1

Warum die '[]' am Ende des Kontrollkästchens? – Maarten

8

Für diejenigen mit Rails arbeiten 4 und die gleiche Frage (wie ich hatte)

die Group.all.each Schleife in @Viktor Trón 's Antwort ist unnötig: Es gibt eine neue FormBuilder-Methode, collection_check_boxes, die nur dafür geschaffen wurde!

Code wäre:

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

Sie dann accepts_nested_attributes_for :lessons zu Ihrem Subject Modell hinzuzufügen haben, und in Ihrem SubjectsController, die subject_params Methode ändern, um "Erlaubnis" verschachteltes params für den Unterricht:

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

In Ihrem SubjectsController, die create oder update Aktionen bleiben unverändert: @subject = Subject.create(subject_params) zum Beispiel, wird das Thema, die erstellen assoziierte Lektionen und aktualisiere ihre HABTM-Beziehungen zu Gruppen korrekt (es sei denn, ich habe irgendwo einen Fehler gemacht!).