【问题标题】:Rails :confirm modifier callback?Rails:确认修饰符回调?
【发布时间】:2012-10-24 20:07:46
【问题描述】:

我想调用一个以用户对确认框的响应为条件的 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 中没有看到任何关于回调的讨论。

【问题讨论】:

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


    【解决方案1】:

    通过跟踪link_to 源,我看到:confirm 修饰符被传递给convert_options_to_data_attributes 方法,该方法指向如今与Rails 捆绑的ujs script(通过jQuery 实现的不显眼的javascript)。在这里我们发现最终用户的响应是通过使用 html 中的data-confirm 属性传递给一个名为confirm:complete 的事件。

    所以答案似乎是“不,您不能通过 url 帮助程序传递回调”。但是您可以在您的app/javascript 中放置一个回调来监听此事件。考虑到我仍然让 Rails 处理事件预防和传播,这似乎是实现我的目标的最不显眼的方式。我等待这一切发生,然后调用我的函数。

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

    【讨论】:

      【解决方案2】:

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

      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()`
      

      希望有帮助

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-12-05
          • 1970-01-01
          • 2011-04-10
          • 1970-01-01
          • 2021-03-19
          • 2019-06-30
          相关资源
          最近更新 更多