1

関連するモデル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:" %>&nbsp;<%= 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ステートメントにのみ表示されます。

どんな助けでもいただければ幸いです。

4

1 に答える 1

0

params [:modality_items]には何が含まれていますか?ビューからのすべてのテキストフィールドを含む配列ですか?

何もない。あなたは本当にあなたのログファイルを見て、paramsハッシュの中に何があるかを見る必要があります。

:modality_itemsは、params [:modality]内にネストされた配列であるため、次のようになります。

params[:modality][:modality_items]

したがってform_for(@modality)、params [:modality]を取得し、f.fields_for(form_forからパイプされたfに注意)は、fields_forparamsが配列としてモダリティハッシュ内にネストされるように配置します。

@itemsはフォームのデータで更新されますか、それともparams [:modality_items]を保存する必要がありますか?

modality_items_attributesのModalityモデル内でaccepts_nested_attributes_for:modality_itemsを使用していて、それらの属性にアクセスできる場合(一括割り当てから保護されていない場合、行は自動的に更新または適切に挿入されます。基本的にaccepts_nested_attributes_forは、paramsハッシュ内にネストされた属性を受け入れます。同名。

公式ドキュメントからのこのリンクは、paramsハッシュがどのように編成されているかを明確に説明しています http://api.rubyonrails.org/classes/ActiveRecord/NestedAttributes/ClassMethods.html

また、fields_for http://apidock.com/rails/ActionView/Helpers/FormHelper/fields_forの詳細については、こちらをお読みください

于 2013-03-26T17:26:03.350 に答える