jQuery remove()関数を使用してフォームから一部のフィールドを削除する際に問題が発生します。ビューにはフォームがあります。このフォームには、一部のサブ要素のフィールドのループセットがあります。ユーザーは各セットを削除できます。コントローラのdestroyメソッドへのリモート呼び出しを使用します。このメソッドは、jqueryを使用してjsファイルを呼び出し、関連するフィールドのセットが含まれているdivをフェードアウトして削除します。
私の問題は、オブジェクトが破壊され、divがうまくフェードアウトしても、フィールドはアクティブなままであるため、フォームが投稿されたときに明らかにエラーが発生することです。
divに加えて、フィールドセットタグを追加して削除し、フィールドセット全体を無効にしようとしましたが、結果は同じです。フィールドはまだ投稿されています(オブジェクトが破棄されたため、エラーが返されます)。
これはビューの関連部分です
- i = 0 # a bit crude, see if can make index count more Railsy
= f.simple_fields_for :fund_levels do |fl|
%div{id: "flheader-#{fl.object.id}"}
%div
= link_to "Sponsor levels", "#", :class => "show_hide", :id => "initiator1_fl#{i}", :style=>"margin-bottom:2px;", :onclick=>"return false"
%div{:class => "slidingDiv #{fund_levels_last?(i, @fund_level_count) ? "shown": "hidd" } whitebg leftadj", :id=>"body_fl#{i}", :style=>"width:100%;" }
= fl.input :title
= fl.input :description
= fl.input :maxnumber
= fl.input :price
%div{:style => "float: right; padding: 20px 20px 20px 0"}
= fund_levels_last?(i, @fund_level_count) ? ( link_to "add new level", ad, {class: 'button orange sm'} ) : ( link_to "remove", accounts_ad_fund_level_path(ad, fl.object.id), {:class => 'button orange sm', :method => :delete, :remote => true, :confirm => t('q.are_you_sure')} )
- i += 1
そしてこれはjQueryの呼び出しです
$('#flheader-<%= @fundlevel.id %>').fadeOut(300, function() { $(this).remove(); });
私が言ったように、オブジェクトは正常に破棄され、divはフェードアウトします。削除されたオブジェクト(フィールドのセット)が投稿されたときにページから完全に削除する方法を理解する必要があります。
編集:問題は、simple_fields_forが各ループの開始直後に非表示のIDフィールドを生成することのようです。つまり、IDフィールドは、実際には破棄されて投稿されているdivの外側にあります。非表示のIDフィールドをDIV内に強制する方法について何か考えはありますか?