collection_select ステートメントがある Ruby on Rails 3.2.13 アプリケーションがあります。collection_select ステートメントは fields_for ステートメント内にあり、collection_select から選択した ID を収集し、それらを使用して別のテーブルにデータを入力します。私が抱えている問題は、collection_select ステートメントが、選択された ID のコレクションを格納する配列に null ID エントリを追加することです。
私の見解での私のコードは次のとおりです。
<%= f.fields_for :media_topics do |media_topic| %>
<%= media_topic.label :topic, "Topics" %><%= media_topic.collection_select(:topic_id, Topic.order("name_en"), :id, :name_en, {}, {multiple: true}) %>
<% end %>
以下は、2 つのオプションを選択した後の配列の例です。
"media_topics_attributes"=>{"0"=>{"topic_id"=>["", "2", "47"], "id"=>"1895"}}
別のスタック オーバーフロー メンバーを通じて、collection_select の空白のエントリが自動的に含まれる非表示の値であることを知りました。Rails 3 では、そのフィールドを含めない方法はありません。ただし、以前の質問Rails 3.2 - collection_selectへの回答で提供されたリンクによると、Rails 4 でこの非表示の値を除外する方法があります。
私は、accepts_nested_attributes_for を初めて使用することを決定する前に、この値をスキップして手動で MediaTopic 行を追加していました。コントローラーのコードを今よりもきれいにしたい。私が抱えている問題は、その空白のエントリをスキップする方法を考え出すことです. この値をスキップできるようにする方法について、API や他の多くの投稿を読みましたが、どれも機能していません。
これは、MediaLibrary モデルの media_topics ネストされた属性のコードです。
has_many :media_topics, dependent: :destroy
accepts_nested_attributes_for :media_topics, allow_destroy: true, reject_if: proc { |attributes| attributes['id'].blank? }
collection_select の Topic モデルには、モデル MediaTopic のフィールド:topic_idを更新するフィールド:idがあります。MediaTopic のもう 1 つのフィールドは:media_library_idです。accept_nested_attributes_for コマンドでフィールドidとtopic_idを試しましたが、メイン モデルの update_attributes を実行すると、トピックを空白にすることはできないというエラーが表示されます。エラーは、配列内の最初の空白のエントリに対して MediaTopic 行を作成しようとしたことが原因であると確信しています。
これを数日間調査しましたが、試したことはありません。API、APIDock、およびその他のソースを確認しましたが、役に立ちませんでした。update_attributes を実行する前に、media_topics_attributes から空白のエントリを削除したいと考えています。コードの書き方を理解していないと思います。例として API でこれを見たことがありますが、これをどこに行けばよいのか、空白の値を取り除くためにこれをどのようにコーディングすればよいのかわかりません。
params = { member: {
posts_attributes: [{ id: '2', _destroy: '1' }]
}}
どんな助けでも大歓迎です。
更新 2013 年 8 月 10 日午後 10 時 46 分 CDT
私のコントローラーでは、すべてのエラーチェックが完了した後、case ステートメントに次の when 句があります。
when @media_library.update_attributes(params[:media_library])
更新 2013 年 8 月 12 日午前 8 時 20 分 CDT
MediaLibrary モデルで、accepts_nested_attributes_for を次のように変更しました。
accepts_nested_attributes_for :media_topics, allow_destroy: true
更新 2013 年 8 月 12 日午前 10 時 50 分 CDT
私のデバッグでハッシュがどのように見えるかは次のとおりです。
media_topics_attributes: !ruby/hash:ActiveSupport::HashWithIndifferentAccess
'0': !ruby/hash:ActiveSupport::HashWithIndifferentAccess
topic_id:
- '2'
- '47'
id: '1896'
ただし、まだMedia topic topic can't be blankというエラーが表示されます。探し続けます。
更新 2013 年 8 月 12 日午後 12 時 15 分 CDT
トピックは、名前のリスト (:id、:name) を持つモデルです。
MediaLibrary は、Topic.name で選択できるようにしたい行のリストです
MediaTopic は、トピックを MediaLibrary に関連付ける行のリストです。
MediaLibrary has_many :media_topics、依存: :destroy
トピック has_many :media_topics
MediaTopic の所属先 :media_library の所属先 :トピック
私が取り組んでいる画面は、MediaLibrary に変更を加え、トピック名をリストする collection_select ステートメントに応じて MediaTopic を更新します。