Rails link_to:确认后做一些事情

时间:2013-08-26 15:01:09

标签: javascript ruby-on-rails link-to

我正在尝试使用link_to

通过AJAX执行保存操作
<%= link_to 'Save', image_path(image), method: :patch, 
        data:{ confirm: 'Save image?', remote: true } %>

我希望在确认时将链接替换为<span>Saving...</span>,但无法找到一种干净的方法。

现有解决方案的问题:

disable_with:
如果我添加:disable_with => '<span>Saving...</span>',将替换链接的内部HTML而不是链接本身。不要那样。

的onclick:
如果我添加:onclick => "$(this).replaceWith('<span>Saving...</span>');",即使用户取消确认

,链接也会立即被替换

是否有适合Rails 3 UJS最佳实践的解决方案?

5 个答案:

答案 0 :(得分:5)

您可以使用挂钩ajax:beforeSend

$('a#my_link_to').bind('ajax:beforeSend', function(evt, xhr, settings) {
  $(this).replaceWith('<span>Saving...</span>');
})

然后你可以添加绑定到ajax:success

$('a#my_link_to')
  .bind('ajax:beforeSend', function(evt, xhr, settings) {
    $(this).replaceWith('<span id="saving">Saving...</span>');
  })
  .bind('ajax:success', function(evt, data, status, xhr) {
    $('span#saving').replaceWith('Saved!');
  })

注意:请参考以下评论,这也是非常重要的

答案 1 :(得分:1)

我认为这是一个案例,你想要的功能超出了Rails的JS助手所提供的功能。在这一点上,我只是避免使用:confirm和:remote选项来link_to,并在普通的jQuery UJS或类似的实现它。

您可能还会考虑隐藏链接并在用户确认时显示“正在...”范围,而不是替换html;我认为它会以这种方式变得更简单,并且仍然可以为您提供所需的效果。

答案 2 :(得分:1)

我认为你应该使用确认:完成事件。 (详情:https://github.com/rails/jquery-ujs/blob/master/src/rails.js

答案 3 :(得分:0)

以下是我最终如何做到这一点:

<%= link_to 'Save', image_path(image), method: :patch, 
        data:{ confirm: 'Save image?', remote: true }, 
        onclick: "$(this).one('ajax:beforeSend', 
            function(e) { $(this).replaceWith('<span>Saving...</span>'); });" %>

(此解决方案的问题在于,如果用户点击,不确认,再次点击等处理程序会累积...因此它不理想......)

答案 4 :(得分:0)

您可以使用confirm:complete事件。它获取了传递的第二个布尔参数,它告诉结果是取消还是确定。