0

親と子という2つのモデルクラスがあります。最初に親が作成され、次に子を追加できます。

親の情報を編集し、場合によっては子を追加できる編集ページを作成しようとしています。

親が子属性にアクセスできるように設定しました。

has_one :child
accepts_nested_attributes_for :child

そして、親情報を編集する私の見解では、すべての親情報を表示するフォームがあり、次に既存の子情報を編集するか、新しい子を追加するためのフィールドがあります。

<%= form_for(@parent, :as => :parent, ...  %>       
    <%= form.text_field(:field_one) %>
    <%= form.text_field(:field_two) %>

    <%= form.fields_for @child do |child| %>  
        <%= child.text_field(:child_field_one) %>
        <%= child.text_field(:child_field_two) %>
    <%end%>
<%end%>

問題は、これを機能させる唯一の方法は、ビューをレンダリングする前に、親編集コントローラーに新しい子を作成させ、それを親に関連付けさせることです。次に、ユーザーが保存しようとすると、コントローラーは子フィールドが空であるかどうかを確認し、空である場合は新しく作成された子を削除します。これに関する 1 つの問題は、編集ページが読み込まれるたびに空の子 (子が存在しないと仮定) を作成し、それをデータベースに保存することです (これは望ましくありません)。

レンダリングする前に新しい子を作成せずに、親編集ページに存在しない子のフィールドを表示するエレガントな方法はありますか? 理想的には、すべてを 1 つのフォームにまとめたいと考えています。複数の保存ボタンを備えた複数のフォームでこれを行う方法を思いつくことができると確信しています。

4

2 に答える 2

2

何をしようとしているのか完全には理解していないかもしれませんが、fields_forタグを使用している場合は、オブジェクトが必要です。これを行う他の唯一の方法は、シンボルを使用して次のように呼び出すことです。

<%=form.fields_for :child do |child| %>

しかし(それがRails 3でもまだ有効であると仮定すると)それは事実上同等です

<%=form.fields_for Child.new do |child| %>

これはと同じです

@child = Child.new

コントローラアクションで。

フォームヘルパーを使用するには、反復するオブジェクトが必要であると確信しています。

于 2012-06-15T22:08:38.243 に答える
0

ユーザーが編集していない限り、子オブジェクトをデータベースに保存したくない場合、1 つの方法は、保存されないようにする子オブジェクトでモデル検証を行うことです。

于 2012-06-16T15:39:11.253 に答える