Rails link_to:确认后做一些事情

我正在尝试使用link_to通过AJAX执行保存操作:

  

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

现有解决方案的问题:

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

的onclick:
如果我添加:onclick => "$(this).replaceWith('Saving...');" 即使用户取消确认,链接也会立即被替换

有没有符合Rails 3 UJS最佳实践的解决方案?

你可以使用钩子ajax:beforeSend

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

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

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

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

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

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

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

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

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

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

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