2016-12-08 3 views
0

Ich zeige eine Tabelle von Schülern an und möchte, dass jede Zeile ein Formularelement hat, das verwendet werden kann, um Informationen über diesen Schüler zu ändern. Was ich derzeit habe (siehe unten) funktioniert nur für den letzten Schüler in der Tabelle, da es scheint, dass die :manual_choice und :student_id keine eindeutigen Formularfelder von Zeile zu Zeile sind.Formulareingaben innerhalb Elixir List Comprehension

Wie mache ich das Verständnis dieser Liste über alle Schüler generieren eindeutige Formularfelder für jede Zeile der Tabelle, so dass ich, wenn ich das Formular abschicken kann, aktualisiert, welcher Schüler eine manual_choice für sie ausgewählt hatte? Wie der geschätzte Dogbert hervorhebt, ist es vielleicht ein wartungsärmerer Ansatz, einfach nur ein separates Formular für jeden Student-Datensatz zu erstellen.

+0

Warum nicht das 'form_for' um die 2 Eingänge (select und text_input) legen? Sie können mehrere Formulare auf der Seite haben, und beim Einsenden wird nur der Wert dieses Formulars übermittelt. – Dogbert

+0

Das könnte funktionieren. Dann würde ich für jede Zeile einen Übergabeknopf benötigen, richtig? – Forerunner117

+0

Ja. Möchten Sie in der Lage sein, mehrere Schüler gleichzeitig zu wechseln? – Dogbert

Antwort

0

Durch Klicken auf die Schaltfläche "Senden" würden nur die Daten für diesen Datensatz gesendet.

Wenn Sie jedoch speziell eine riesige Tabelle mit einer Schaltfläche zum Senden am unteren Rand wünschen (eine bessere Lösung für einige Bulk-Aktualisierungssituationen), könnten Sie möglicherweise einen inkrementierten Zähler in den Namen jeder Eingabe einfügen. Ein einfaches Beispiel könnte wie folgt aussehen:

<%= @all_students |> Enum.with_index |> Enum.each(fn(student, index) -> %> 
    ... 
    <%= select f, "student_#{index}[manual_choice]", @projects, class: "form-control" %> 
    <%= text_input f, "student_#{index}[id]", value: student.id, style: "display:none" %> 
    ... 
<% end %> 

Hinweise:

  1. Ich benutze Enum.with_index und Enum.each über die Schülerliste zu durchlaufen, statt for student <- @students. Ich komme aus der Ruby-Welt, wo for Loops verpönt sind; Ich habe festgestellt, dass ich immer mit Enum.each oder Enum.map umgehen kann, ich habe noch nicht benötigt, um das for Konstrukt zu verwenden.
  2. Für die Eingabeelemente & gebe ich eine Zeichenfolge, die für jedes Element eindeutig ist. Zum Beispiel sollte der ausgewählte Name der fünften Zeile student_4[manual_choice] lauten.
  3. Ich habe das alles nicht getestet; Ich spucke nur. Ich bin zuversichtlich, dass dieser allgemeine Ansatz gut funktionieren wird, aber nicht genau in der Semantik. Zum Beispiel weiß ich nicht, ob Enum.each tatsächlich alle generierten Markup/Inhalte ausdrucken wird; Enum.map könnte besser funktionieren.
  4. Der Controller-Endpunkt, der das übermittelte Formular empfängt, muss in der Lage sein, die Params zu verstehen und über die Formulardaten jedes Schülers zu iterieren. Ich vermute, das ist einfach (es ist super einfach in der Rails-Welt), aber noch nicht in Elixir/Phoenix.

Bei # 4 gibt Ihnen Mühe, vielleicht ein einfacherer Ansatz jedes Eingabeelement würde mit der Array-Syntax zu nennen, wie: "students[manual_choice][]" und "students[id][]". Auf diese Weise können Sie in der Controller-Aktion über die verschachtelten Parameter students[id] iterieren und darauf vertrauen, dass jeder Eintrag dem gleichen Index students[manual_choice] entspricht.

Verwandte Themen