Rails :confirm修饰符回调?

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 helper?我在文档中没有看到任何关于回调的讨论。

3个回答

24
通过跟踪link_to的源代码,我发现:confirm修饰符被传递给convert_options_to_data_attributes方法,该方法指向随Rails捆绑的 ujs脚本 (通过jQuery实现无侵入式JavaScript)。在这里,我们发现最终用户的响应通过在HTML中使用data-confirm属性传递给名为confirm:complete 的事件。
因此,看起来答案是“不,您不能通过url helper传递回调函数”。但是,您可以在app/javascript中放置回调以侦听此事件。考虑到我仍然让rails处理事件预防和传播,这似乎是最不具干扰性的方法。我等待所有这些都发生,然后调用我的功能。
$(document).on('confirm:complete', function (e, answer) {
  if (answer) {
    // user confirmed!
    myCallbackFunction();
  } else {
    // user canceled!
  }
});

1

我遇到了类似的问题(如何在AJAX调用中使用内联:confirm选项进行html助手?)。@Micah的答案虽然可行,但并不是"Rails 3 way"。

  1. 需要将remote: 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()`

希望有所帮助。

1

在2020年,原有的答案对我并不适用。最终,我采用了以下方法:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接