0

スタンドを常駐および通信の2つのチェックボックスにリンクしようとすると問題が発生し、複数のスタンドを選択すると、それらは別々に保存されているように見えます。

1つのスタンドがある場合、パラメーターは配列のハッシュ内に正しい方法で格納されているように見えますが、同じ配列に別のスタンドを追加すると、ハッシュが入れ替わるように見えます。私のビューは次のようになります。また、同じパーシャルを呼び出す別のスタンドを追加する別のオプションがあります。これは次のとおりです。

- unless @stands.empty?
%tr#show_stands.contentText
%td{:width => "27%", :valign => "top"}
  Select Stand For Ownership
%td{:width => "15%", :valign => "top"}
  = collection_select "owned_stands[]", "stand_id", @stands, :id, :erf_no_rr_no,  options ={:prompt =>"Please select stand..."}, {:class => 'dropdownSelect'}
   
   
%td{:valign => "top"}
  = check_box_tag "owned_stands[][owner_comm_list]"
  Add to Owners Communication list
  = check_box_tag "owned_stands[][resident_comm_list]"
  Add to Residents Communication list

選択したスタンドの数に応じて、2つ以上のハッシュを含むアレイを期待しています。1つのスタンドと両方のチェックボックスを選択した場合、ハッシュは次のようになります。

([{"stand_id" => "1", "resident_comm_list" => "1", "owner_comm_list" => "1"}])

そして、私が2つ持っている場合、私は期待します:

([{"stand_id" => "1", "resident_comm_list" => "1", "owner_comm_list" =>    "1"},{"stand_id" => "2", "resident_comm_list" => "1", "owner_comm_list" => "1"}])

しかし今、私が2つのスタンドを選択すると、次のことがわかります。

 ([{"stand_id" => "1", "resident_comm_list" => "1"}, {"owner_comm_list" =>    "1"},{"stand_id" => "2"},{"resident_comm_list" => "1", "owner_comm_list" => "1"}])

また、stand_idを選択するためにハッシュをループする必要がある場合、コントローラー内でエラーが発生します。

4

1 に答える 1

2

問題は、check_box_tags が params ハッシュのどこに収まるかを適切に定義していないことにあります。

通常、Rails を使用すると、フィールド ID をハード コーディングする必要がなく、すべてのネストを簡単に行うことができます。残念ながら、チェックボックスの配列を使用しようとすると、これらの便利なメソッドは失敗します。デフォルト値と配列に関するチェックボックスの落とし穴のため。

check_box_tag を使用すると問題は回避されますが、通常はフォーム オブジェクトによって提供される情報を入力する必要があります。

複数のパーシャルからのすべてのフィールドが同じ params 配列に追加されているようです。Rails が配列内の重複したパラメーターを処理する方法は、別のインデックスを開始することです。

生成されたソースをよく見て、正しい結果を得る手がかりとして使用してください。

あなたが投稿したコードは、私がそれをいじれるようになるまでに多大な労力を必要としました。したがって、これが機能することを保証することはできません。また、コントローラーのコードを投稿しないと、エラーが発生する理由を知る方法がありません。

各パーシャルのパラメーターにインデックスを追加するソリューションに関係なく。

あなたはこのようなことをしたいです。index は、各パーシャルの一意の値です。

- unless @stands.empty?
%tr#show_stands.contentText
%td{:width => "27%", :valign => "top"}
  Select Stand For Ownership
%td{:width => "15%", :valign => "top"}
  = collection_select "owned_stands[#{index}][]", "stand_id", @stands, :id, :erf_no_rr_no,  options ={:prompt =>"Please select stand..."}, {:class => 'dropdownSelect'}
   
   
%td{:valign => "top"}  
  = check_box_tag "owned_stands[#{index}][owner_comm_list]"
  Add to Owners Communication list
  = check_box_tag "owned_stands[#{index}][resident_comm_list]"
  Add to Residents Communication list

次のような params ハッシュが生成されます。

params["owned_stands"] =
  {"0" =>  
    {"stand_id" => 1, "owner_comm_list" => 1, "resident_comm_list" => 1}
  }

両方のチェックボックスがある 2 つのスタンドの場合:

prams[owned_stands] = 
 {
  "0" =>  
    {"stand_id" => 1, "owner_comm_list" => 1, "resident_comm_list" => 1}, 
  "1" => 
    {"stand_id" => 2, "owner_comm_list" => 1, "resident_comm_list" => 1}
 }

accept_nested_attributes_for とネストされた fields_for の使用法を調べることをお勧めします。ビューとコントローラーの両方でこの種のことを単純化しますが、それでもチェックボックスの問題の餌食になります。

于 2009-10-12T15:40:33.513 に答える