5

ネストされた形式でHABTMチェックボックスを実装しようとしています。

現在、3つのモデルがあります。科目、レッスン、グループ。関連付けは次のとおりです。各科目には多くのレッスンがあります。各レッスンには多くのグループがあり、それらに属しています。

現在、これらすべてを1つの作成および編集フォームに実装しようとしています。レッスンがサブジェクトにネストされ、レッスンごとに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%>

現在、この行「subject [lessons_attributes [0]] [group_ids] []」を使用して、最初のレッスンに保存しています。

ただし、レッスンの数はさまざまであり、レッスンの「数」、つまり「subject [lessons_attributes [ 0 ]][group_ids][]」の太字の0をどのように決定できるかわかりません。グループを正しいレッスンに保存できるように。

何かアドバイスをいただければ幸いです。

4

2 に答える 2

10

Rails 4を使用していて、同じ質問がある場合(私が持っていたのと同じ)

@ViktorTrónの答えのGroup.all.eachループは不要です。そのためだけに作成された新しい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 :lessonsする必要があります。で、メソッドを変更して、レッスンのネストされたパラメーターを「許可」します。SubjectSubjectsControllersubject_params

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

あなたのSubjectsControllerでは、createまたはupdateアクションは変更されません。@subject = Subject.create(subject_params)たとえば、サブジェクト、関連するレッスンを作成し、グループとのHABTM関係を正しく更新します(どこかで間違えた場合を除く)。

于 2014-02-18T11:38:58.843 に答える
5

ベストプラクティスは、サブジェクトに(いくつかの)レッスンオブジェクト(つまりform.object)を事前に構築してから、それらを繰り返し処理してレッスンごとのフィールドを作成することです。simple_formまたはformtasticを使用する場合、チェックボックスを介したコレクションの選択は簡単です。

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

を使用する場合check_box_tagは、レッスンをインデックスで繰り返し、チェックボックス名のインデックスに置き換える必要があります。

<% 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 %>
于 2013-02-14T16:40:15.397 に答える