0

送信ボタンをクリックすると、フォームを送信してテーブルの行を削除しようとしました。

行の削除機能 コーヒースクリプトの方法でそれを行い、「テーブル行の削除」が機能します。

ただし、フォーム送信機能が動作しませんでした。

しかし、Coffee Script を削除すると、送信フォームは再び機能します。

コーヒースクリプト

jQuery ->
    $("#rf_tbl").on "click", "input[type=\"submit\"]", (e) ->
        $(this).closest("tr").remove()

意見

  = form_tag kill_running_task_remote_focus_path, :method => :get, remote: true do
    %table#rf_tbl.table.table-condensed.table-striped

      %tr
        %th User
        %th Camera IP
        %th Created Time
        %th PID
        %th Control

      - @running_tasks.each do |running_task|
        %tr{:id => "#{running_task[:pid]}"}    
          - running_task.each do |key, value|        
            %td
              = value
          %td
            = hidden_field_tag :task, running_task[:pid]
            = submit_tag "Kill This Task" ,:class=> "btn btn-primary autotest"

Railsでは普通ですか?

アドバイスをください、ありがとう。

4

1 に答える 1

1

これは正しくありません。

問題 1: すべての行に対して 1 つの大きなフォームがあります。送信するときに、その行のデータのみを削除したいのですが、フォーム全体を送信して終了します。これは非効率的で、エラーが発生しやすくなります。修正は、行ごとにフォームを作成することです (link_to と remote:true を使用することもできます。これは、リンクごとに各フォームで終了します)。

問題 2: フォームの送信を聞かず、すぐに行を削除します。UJS( のプロセッサremote: true)もこのイベントを監視します。私の推測では、これまでに行われたことはありませんが、Javascript はシングル スレッドであるため、2 つのリスナーには実行する順序があります。リスナーが最初に実行された場合、データが削除され、UJS が来ると、シリアル化するフォーム フィールドがなく、泣くでしょう :(

問題 2 では、行を削除しなくても、別の問題もあります。送信に失敗した場合はどうなりますか? サーバーの応答が何であれ、リスナーは行を完了としてマークします。

when、を使用するなど、jQuery Ajax内にソリューションがありますdone。ただし、UJS を使用しているため、最も簡単な解決策は、スクリプトをレンダリングしてサーバーの応答時に実行することです。

たとえば、行 2 には専用のフォームがあります。送信時に、コントローラはこのリクエストを受け取り、タスク ID を認識します。次に、応答 js.erb で、この特定の div を削除するように割り当てることができます。

$('#task_#{task.id}').remove();
于 2013-11-11T06:54:42.810 に答える