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
-
В блоке управления контроллером respond_to
выберите ответ для js
-
создать файл 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()`
Надеюсь, что поможет