Rails:确认修饰符回调?

时间:2012-11-05 00:30:18

标签: ruby-on-rails-3.2 unobtrusive-javascript link-to view-helpers link-to-remote

我想调用一个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帮助器?我没有在documentation中看到有关回调的讨论。

3 个答案:

答案 0 :(得分:22)

通过关注link_to来源,我看到:confirm修饰符已传递给convert_options_to_data_attributes方法,该方法指向与Rails捆绑在一起的ujs script (通过jQuery不引人注目的javascript)。在这里,我们发现最终通过使用html中的confirm:complete属性将用户的响应传递给名为data-confirm的事件。

所以似乎答案是“不,你不能通过url helper传递回调”。但是你可以在你的app/javascript中收听一个回调来监听这个事件。这似乎是实现我的目标最不显眼的方式,考虑到我仍然让rails处理事件预防和传播。我等待所有这一切发生,然后调用我的功能。

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

答案 1 :(得分:0)

我有类似的问题(How to use inline :confirm option for html helpers with AJAX calls?)。 @ Micah的答案,即使有效,也不是“Rails 3 way”的答案。

  1. remote:需要将true选项添加到link_to帮助程序,例如
  2. 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

    3. 应用程序/视图/比赛/ destroy_session.js.coffee:

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

      希望有所帮助

答案 2 :(得分:0)

在2020年,被接受的答案对我不起作用。我最终做了这样的事情:

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