2016-12-08 4 views
0

私は学生のテーブルを表示していて、各行にその学生に関する情報を変更するために使用できるフォーム要素が必要です。私が現在持っているもの(下に示す)は、:manual_choice:student_idが行ごとに一意のフォームフィールドではないため、テーブルの最後の生徒にしか動作しません。エリクサーリスト内でのフォーム入力の理解

どのように私はフォームの提出時にmanual_choiceが選択されたかを更新できるように、すべての生徒がこのリストの理解度を表の各行に固有のフォームフィールドを生成するようにしますか?

<%= form_for @changeset, assignments_path(@conn, :manual_assign), fn f -> %> 
<table id="students" class="display" cellspacing="0" width="100%"> 
    <thead> 
    <tr> 
     <th>Student Name</th> 
     <th>Assigned Project</th> 
     <th>Override Assignment</th> 
    </tr> 
    </thead> 
    <tbody> 
    <%= for student <- @all_students do %> 
     <tr> 
     <td><%= student.student_name %></td> 
     <td><%= student.assigned_project %></td> 
     <td class="text-right"> 
      <div class="form-group"> 
       <%= select f, :manual_choice, @projects, class: "form-control", id: "manual_choice" %> 
       <%= text_input f, :student_id, class: "form-control", value: student.id, style: "display:none" %> 
      </div> 
     </td> 
     </tr> 
    <% end %> 
    </tbody> 
</table> 
<% end %> 
+0

なぜ2つの入力(selectとtext_input)の周りに 'form_for'を置かないのですか?あなたはページ上に複数のフォームを置くことができ、送信するフォームはそのフォームの値だけを送信します。 – Dogbert

+0

これはうまくいく可能性があります。次に、各行に送信ボタンが必要ですか? – Forerunner117

+0

はい。一度に複数の生徒を変更できるようにしたいですか? – Dogbert

答えて

0

尊敬されているDogbertが指摘しているように、メンテナンスの手間がかからないのは、単にStudentレコードごとに別のフォームを作成することです。送信ボタンをクリックすると、そのレコードのデータのみが送信されます。

しかし、一番下のサブミットボタン付きの1つの巨大なテーブルが必要な場合(一部の一括更新の状況に適しています)、各入力の名前に増分カウンタを含めることができます。

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

注:

  1. 私が代わりにfor student <- @studentsの、学生のリストを反復するEnum.with_indexEnum.eachを使用する簡単な例では、このようになります。私はRubyの世界から来ています。そこではforのループが目立っています。私はいつもEnum.eachまたはEnum.mapとすることができますが、私はまだfor構成を使用する必要はないことを発見しました。
  2. 入力要素の選択&では、各要素に固有の文字列を指定します。たとえば、5行目の選択名は​​でなければなりません。
  3. 私はこれをすべてテストしていません。私はちょうどspitballingです。私はこの一般的なアプローチがうまくいくと確信していますが、正確なセマンティクスについては明確ではありません。例えば、Enum.eachが生成されたマークアップ/コンテンツを実際に印刷するかどうかはわかりません。 Enum.mapがうまくいく可能性があります。
  4. 提出されたフォームを受け取るコントローラのエンドポイントは、各学生のフォームデータに対してparamsを理解し、反復できる必要があります。私はこれが簡単だと思っています(Railsの世界では非常に簡単です)が、まだElixir/Phoenixではこれをやっていません。 "students[manual_choice][]""students[id][]":ケース#4で

は多分簡単な方法は次のように、配列の構文を使用して、各入力要素に名前を付けるだろう、あなたにトラブルを与えます。こうすることで、コントローラーアクションでは、入れ子になったパラメーターstudents[id]を反復処理し、各項目が同じインデックスstudents[manual_choice]に対応していることを信頼できます。

関連する問題