関連するモデルModalityItemを持つModalityモデルがあります。モダリティには多くの:modality_itemsがあり、ModalityItemは:modalityに属しています。表示したいフィールドの1つは、MediaLibraryの名前フィールドです。IDはModalityItemのmedia_library_idと一致します。
各モダリティに対して最大15のModalityItem行を許可する予定です。Railsアプリケーションは、新しいレコードを追加する必要がある場合はModalityItemの空白行を表示し、レコードが存在する場合はModalityItem行データを表示します。
これは、modality_controllerのeditメソッドにあるコードで、Modalityの名前を変更することもできます。配列@items(Array.new(15))を作成し、各配列要素にModalityItemまたはModalityItem.newの行をロードしました。選択したModalityのModalityItem行が存在しない場合、配列全体にModalityItem.newの15個の要素が含まれます。ModalityItem行が存在する場合、その行を対応するMediaLibrary行に結合し、その名前を編集ビューに表示します。
@modality = Modality.find(params[:id])
@modality_items = ModalityItem.joins('JOIN media_libraries ON media_libraries.id = modality_items.media_library_id').where("modality_id = ?", @modality.id).all
@items = Array.new(15)
count = 0
while count < @items.size
if @modality_items && count < @modality_items.size
@items[count] = @modality_items[count]
else
@items[count] = ModalityItem.new
end
count += 1
end
これが編集ビューの私のコードです。
<%= form_for(@modality) do |f| %>
<%= render 'shared/error_messages', object: f.object %>
<p style="font-weight: bold; font-size: 114%;"><%= link_to "Return to Manage Modalities", modalities_path %></p><br>
<%= f.label :name, "Modality Name:" %> <%= f.text_field :name %><br><br>
<%= f.fields_for :modality_items, @items do |item| %>
<div class="modality-class">
<%= item.label :media_library_id, "Media Library" %><%= item.text_field :media_library_id %>
<div class="short-label"><%= item.label :rank, "Rank" %></div><%= item.text_field :rank %>
</div><br><br>
<div class="modality-instruct">
<%= item.label :instructions, "Instructions" %><%= item.text_field :instructions %>
</div><br><br>
<% end %>
<%= f.submit "Save changes to Modality", class: "btn btn-medium btn-custom" %><br><br>
<p style="font-size: 114%; font-weight: bold;"><%= link_to "Delete this modality?", @modality, method: :delete, data: { confirm: "You sure you want to Delete this modality?" } %></p>
<% end %>
配列内のドロップダウンリストにある複数のアイテムのID番号をキャプチャしたcollection_selectステートメントでfields_forのみを使用しました。これらのIDを使用して、更新していたメインテーブルに関連する別のテーブルを作成しました。
このシナリオでは、画面に入力された情報を収集し、それをループしてレコードを作成します。モダリティの既存のModalityItem行をすべて削除し、毎回再作成する予定です。私がcollections_selectでfields_forを使用したとき、インスタンス変数@whatevernameをparams [:whatevername]に等しく設定し、IDをループしました。私が含めたコードで、@ modality_items = params [:modality_items]を設定し、それを使って何かを行うと思います。誰かがデータを入力し、ボタンをクリックして更新するとどうなるかについて、次の質問があります。
params [:modality_items]には何が含まれていますか?ビューからのすべてのテキストフィールドを含む配列ですか?
@itemsはフォームのデータで更新されますか、それともparams [:modality_items]を保存する必要がありますか?
これは基本的な情報だと思いますが、これは初めてのことであり、fields_for offとonについて何ヶ月もオンラインで検索した後、答えを見つけることができませんでした。
注:続行する前にfields_forのフィールドにアクセスする方法についての詳細が必要なため、現在、ビューでMediaLibraryの名前を参照していません。また、ModalityモデルとMediaLibraryモデルの両方に:nameが含まれているという問題もあります。Modalityの名前は更新可能ですが、MediaLibraryの名前はfields_forステートメントにのみ表示されます。
どんな助けでもいただければ幸いです。