0

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内に強制する方法について何か考えはありますか?

4

1 に答える 1

0

OK、さらに数時間の調査の後、問題を解決しました。

まず第一に、オブジェクト ID がループされた div の外に出力されるのを避けるために、オブジェクト ID を隠しフィールドとして手動で含める必要がありました。これが完了すると、simple_forms はそれを自動的に含めないので、好きな場所に配置できます。

さらに、メイン フォーム コントローラを変更して allow_destroy と reject_if の値を変更する必要がありました。すべてが空白でした。

于 2012-10-29T03:05:02.897 に答える