2011-08-22 10 views
6

私はshow.erbのネストされたアトリビュートを持っており、空のネストされたアトリビュートを作成し、ネストされたアトリビュートの削除リンクを追加する

<%= form_for @question do |q| %> 
    <% q.fields_for :answers, @question.answers do |l| %> 
    <tr> 

     <td><%= l.text_field :text %></td> 
     <td><%= l.check_box :correct %></td> 
     <td><%= l.text_field :imagename %></td> 
     <td><%= l.number_field :x %></td> 
     <td><%= l.number_field :y %></td> 
    </tr> 
    <% end %> 

    <tr> 
     <td colspan=5 align=right><%= submit_tag '+' %> 
    </tr> 

<% end %> 

私は、のlink_toが動作するように「破壊」したいが、私はあなたがlを使用している変数が正しくない

<%= link_to 'Destroy', l, :controller => "answer", :confirm => 'Are you sure?', :method => :delete %> 

答えて

21

なぜリンクを使用しますか?ネストされた属性で破棄機能を使用することもできます。

あなたがする必要があるすべてはあなたのaccepts_nested_attributes定義で:allow_destroy => trueを追加し、各レコードに

<%= l.check_box '_destroy' %> 

を追加することです。 このようにして、レコードを保存するときにチェックボックスをオンにして、すべてのネストされたレコードを削除します。 Googleからのこれを見つける人のために

1

グリッドにこれを追加したとき、私はundefined method 'plural'を取得しています。 fields_forブロックからブロックオブジェクトを取得すると、オブジェクト自体のインスタンスではなくFormBuilderのインスタンスになります。リンク先のURLを教えてください。それはAnswers#destroyですか?破壊しようとするものを特定するために、あなたはこの行動にどのようなIDを送りたいのですか? link_toはフォーム要素ではありません。アンカータグのヘルパーです。そのリンクを構築するためのフォームビルダではなく、URLが必要です。

これは回答フォームのリストですか?答えごとに1つ?その場合は、fields_forを使用するのではなく、ループすることができます。

これが正しい軌道に乗るのに役立ちます。

+0

はい、私はフォームビルダーの代わりにモデルを渡さないためのばかだよ –

9

削除チェックボックスが正しい方法であるかもしれない技術的にながら、私はそれが混乱だと思う - 唯一の利点は、それが削除するために、2回のクリックを必要とすることである(ボックスを選択して、アップデートを打ちます)。削除が何が起きているかを明確にし、おそらくそれを元に戻す簡単な方法を追加するほうがよいかもしれません。

次は、コールバックまたはjsビューファイルのページの更新を処理するために、アップデートをサーバーにajaxとして送信することです。リモートを削除:trueと通常のリンクとして動作します。

# For my form I build a new object if it's missing, 
# so I need to check that this is not a new nested attribute. 
- unless question.answers.new_record? 
    # Basically, I am sending over the fields that would be sent 
    # by the _delete check box form being updated. 
    = link_to "Delete", question_path(question.id, question: { answers_attributes: { id: question.answers.id, "_destroy" => true }}), remote: true, confirm: "Really delete?", method: :put 
+1

これはhas_many関係でうまく動作します。 また、確認ボックスを取得するには、 '、data:{confirm: '本当ですか?' } '直後'メソッド::put' 私が気づいたことは、(少なくとも私の場合は)アイテムが削除されたがページが自動的にリロードされないということでした。 – 8bithero

+0

has_many(何故それがうまくいかないのか分かりません)の確認をありがとう。また、あなたのコメントからいくつかのコメントを追加し、リモートを削除する場合:true、それは通常のリンクのように動作し、ページをリフレッシュする必要があります - そうでなければ、あなた自身でそれを処理する必要があります。 – d3vkit

+0

私は同意する、UXは本当に奇妙な削除チェックボックス – Dex

関連する問題