1

リンク ボックスと多対多の関係があり、それらのモデルを 1 つのフォームにまとめて、同じページから更新できるようにしたいと考えています。配列のすべての要素を表示するために check_box を取得するのに本当に苦労しています。私の問題。また、私は RoR に非常に慣れておらず、少し古いビデオ チュートリアル (2.0 より前) に従っているので、私のコードについてお詫び申し上げます。これまでのところ、配列内の 1 つのキー ペア (最後のキー ペア) のみを出力するようにしました。フォームの外ではありますが、チュートリアルで使用されているコードは、本来の方法で正確に機能します。しかし、それはほとんど役に立ちません!Host はメイン フォームのモデルであり、Billing はフォームに追加しようとしている外部モデルです。

これは、チュートリアルのフォームの外で機能するコードです。

<% for billing in @billings -%>
<%= check_box_tag('billing_title[]', billing.id, @host.billings.collect
{|obj| obj.id}.include?(billing.id))%> <%= billing.title %><br />
<% end -%>

フォーム内で機能させる方法を知る必要があります。これは、ループ処理後に最後の配列キーペアのみを取得する前述のコードです。

<% f.fields_for :billings do |obj| %><br />
<%= check_box_tag('billing_title[]', billing.id, @billings.collect
{|obj| obj.id}.include?(billing.id))%> <%= billing.title %><br />
<% end %>

デバッグ (@billings) :

--- 
- !ruby/object:Billing 
attributes: 
title: Every Month
id: "1"
attributes_cache: {}

- !ruby/object:Billing 
attributes: 
title: 12 Months
id: "2"
attributes_cache: {}

- !ruby/object:Billing 
attributes: 
title: 6 Months
id: "5"
attributes_cache: {}

どんな助けでも本当に感謝しています。

4

3 に答える 3

2

Craig、あなたが探しているのは、ネストされたモデルをフォームで処理するためのはるかに優れた方法であるaccepts_nested_attributes_forのようです。

Ryan のすべての作品を盗んでここに再投稿するのではなく、彼のスクリーンキャストへのリンクを提供します。

http://railscasts.com/episodes/196-nested-model-form-part-1

これは、彼の複雑なフォーム シリーズに基づいています。

このチュートリアルをあなたがやろうとしていることに合わせることができるはずですが、そうでない場合は喜んでお手伝いします.

編集:

さて、あなたのコードを見た後、あなたに問題を引き起こしていることがいくつかあります. :)

まず第一に、アソシエーションを使用すると、課金用に追加のコレクションを取得する必要がなくなります。つまり、次のようになります。

@host = Host.find(params[:id])
@voips = Voip.find(:all)
@custsupps = Custsupp.find(:all)
@payments = Payment.find(:all)
@billings = Billing.find(:all) # <-- This is not needed and causing your problems

モデル内の関連付けの設定により、これがすべて行われます。これは Rails の魔法の一部です。:D

ここで、関連付けを使用する場合、オブジェクトが実際に関連付けられていることを確認する必要があることに注意することが重要です。つまり、データベースに 3 つの Billings オブジェクトがあり、それらが Host オブジェクトに関連付けられていない場合、それらはフォームに表示されません。

チェックボックスを使用して請求をホストに関連付けようとしている場合は、ホストに既に関連付けられている請求のみを表示するフォームのみであるため、別のアプローチを取る必要があります。

たとえば、チェックボックスが「有料」属性 (ブール値) を表すホストに関連付けられている既存の請求を編集または変更しようとしている場合、このアプローチは問題なく、フォーム コードは次のようになります。

<% f.fields_for :billings do |b| %><br />
  <%= b.check_box :paid %> <%= b.title %>
<% end %>

したがって、機能の観点から何を達成しようとしているのかを明確にしていただければ、より良い解決策を見つけることができます。

于 2010-03-29T22:46:23.133 に答える
0

forループに問題があるように見えます...

サンプル コードでは、@billings(コントローラーから渡された請求オブジェクトの配列) をループし、現在の を呼び出していbillingます。

フォーム コードでは、:billings(請求の ActiveRecords を参照するシンボル) をループし、現在のものを呼び出していobjます。次に、紛らわしいことに、コードobjは @billings.collect 関数で再び変数名を再利用します...しかし、これにはローカル プライベート スコープが必要であり、メイン ループには影響しませんが、一見して解釈するのは困難です。

とにかく、フォーム ループ内のものはを参照しないobjため、変数 -- を使用しています。これは、ループbillingしても変化しませんが、最後の値を保持します: 前のループの最後の項目です! これは、最後のタグしか表示されない理由を説明しています。(また、debug(@billings)関数はソートのレコードを独自にループ処理します。これは fields_for do ループ内にはありません。)

次のように、フォーム コードの最初の行を変数名を再利用するように変更することから始めますbilling

<% f.fields_for :billings do |billing| %><br />

Ruby のブロック構文は、最初はかなり混乱する可能性があります (または、自分で作成したのではないコードを読むときはいつでも)。そして、それぞれに何らかの機能を実行します。また、見た目が似ている名前の混同にも注意してください。@billing、@billings、:billings、およびbillings は、Ruby と Rails にとってはすべて別のものです。幸運を!

于 2010-03-30T05:01:39.817 に答える
0

私は私の答えについて確信が持てませんが、試してみます...

<% f.fields_for :billings, @billings do |obj| %>
   # ...
<% end %>
于 2010-03-29T20:38:00.280 に答える