12

確認ボックスへのユーザーの応答を条件とするjavascript関数を呼び出したいと思います。

たとえば、次のアンカーがあります。

<%= link_to 'Sign Out', destroy_session_path, confirm: 'Are you sure that you would like to sign out?', method: :delete %>

控えめなJavaScriptを放棄して、自分のjQueryコールバックをアンカーにバインドする必要がありますか?

または、コールバック関数をRailsのURLヘルパーに渡す魔法の方法はありますか?ドキュメントにコールバックの説明はありませんでした。

4

3 に答える 3

24

link_toソースをたどると、:confirm修飾子がconvert_options_to_data_attributesメソッドに渡されていることがわかります。このメソッドは、最近Railsにバンドルされているujsスクリプト(jQueryを介した控えめなJavaScript)を指しています。ここで、最終的にユーザーの応答がhtmlconfirm:completeの属性を使用して呼び出されたイベントに渡されることがわかります。data-confirm

したがって、答えは「いいえ、URLヘルパーを介してコールバックを渡すことはできません」であるように見えます。app/javascriptただし、このイベントをリッスンするためにコールバックを入れることができます。これは、私がまだレールにイベントの防止と伝播を処理させていることを考えると、私の目標を達成するための最も目立たない方法のようです。これらすべてが発生するのを待ってから、関数を呼び出します。

$(document).on('confirm:complete', function (e, answer) {
  if (answer) {
    // user confirmed!
    myCallbackFunction();
  } else {
    // user canceled!
  }
});
于 2012-11-05T01:36:39.583 に答える
1

私は同様の問題を抱えていました(AJAX呼び出しでhtmlヘルパーのインライン:confirmオプションを使用する方法は?)。@Micahの答えは、機能していても、「Rails3way」のようにはなりません。

  1. リモート:trueオプションをlink_toヘルパーに追加する必要があります。例:

link_to 'Sign Out', destroy_session_path, remote: true, confirm: 'Are you sure that you would like to sign out?', method: :delete

  1. コントローラーの変更respond_toブロックでjsに応答します

  2. メソッドに対応する名前でjsファイルを作成します(例:destroy_session.js.coffee)。

app / views / Competitions / destroy_session.js.coffee:

jQuery ->
  $("form[data-remote]").on "ajax:success", (e, data, status, xhr) ->
    $(e.currentTarget).closest('tr').fadeOut()`

お役に立てば幸い

于 2013-04-18T20:12:10.290 に答える
1

2020年には、受け入れられた答えは私にはうまくいきませんでした。私は代わりにこのようなことをすることになりました:

$(document).on('confirm:complete', function (e) {
  if (e.originalEvent.detail[0]) {
    // user confirmed!
    myCallbackFunction();
  } else {
    // user canceled!
  }
});
于 2020-02-20T02:59:25.843 に答える