0

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 コマンドでフィールドidtopic_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 を更新します。

4

2 に答える 2

0

MediaLibrary モデルで

alias_method :underlying_media_topics_attributes=, :media_topics_attributes=

def media_topics_attributes=(hash_of_hashes)
  hash_of_hashes.each { |key, hash| hash[:topic_id].reject!(&:blank?) }
  self.underlying_media_topics_attributes=(hash_of_hashes)
end
于 2013-08-11T00:01:40.070 に答える
0

@vinodadhikary によると、配列の null エントリは Rails 3 で期待どおりに機能しています。最近、このアプリケーションを Rails 4 で書き直しました。最初に has_many を使用してすべてのテーブルを関連付けることで、ロジックを完全に書き直しました。また、collection_select ステートメントを使用して fields_for ロジックを置き換えました。最初の {} に include_hidden = false を追加したところ、null エントリは配列に表示されません。数日前に同様の質問をし、多くの検索を行った後、解決策を思いつきました。詳細は以下のリンクにあります。

Rails 4 - collection_select を使用して、ネストされた属性を持つ中間テーブルの ID の配列を取得する

于 2013-11-13T22:33:13.310 に答える