Rails: подтвердить обратный вызов модификатора?

Я хочу вызвать функцию javascript, которая будет обусловлена ​​ответом пользователя на поле подтверждения.

Например, у меня есть следующий якорь:

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

Должен ли я просто отказаться от ненавязчивого javascript и связать свой собственный ответ jQuery с моим якорем?

Или есть какой-то магический способ передать функцию обратного вызова в помощник URL-адреса Rails? Я не видел обсуждения обратных вызовов в документации .

Ответ 1

Следуя источнику link_to, я вижу, что модификатор :confirm передается методу convert_options_to_data_attributes, который указывает на ujs script, который в настоящее время связан с Rails (ненавязчивый javascript через jQuery). Здесь мы находим, что в конечном итоге ответ пользователя передается событию с именем confirm:complete с помощью атрибута data-confirm в html.

Итак, кажется, что ответ "нет, вы не можете передать обратный вызов через помощник URL". Но вы можете поместить обратный вызов в свой app/javascript для прослушивания этого события. Это, по-видимому, самый ненавязчивый способ достичь моей цели, учитывая, что я все еще позволяю рельсам справляться с предотвращением и распространением событий. Я жду, пока все это произойдет, а затем вызовите мою функцию.

$(document).on('confirm:complete', function (e, answer) {
  if (answer) {
    // user confirmed!
    myCallbackFunction();
  } else {
    // user canceled!
  }
});

Ответ 2

У меня была аналогичная проблема (Как использовать inline: подтвердить вариант для html-помощников с вызовами AJAX?). Ответ @Micah, хотя работает, не то, что будет "Rails 3 way".

  • remote: параметр true должен быть добавлен в helper-link_, например.

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

приложение/просмотров/соревнования/destroy_session.js.coffee:

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

Надеюсь, что поможет