我在一个Rails 3.2应用程序中有一个索引视图,它在每条记录旁边显示一个删除按钮。
<%= link_to "Delete", object, method: :delete, remote: true, class: 'delete' %>我最初创建了一个destroy.js.erb文件,用于在对象被销毁时将其删除。然而,这并没有提供我想要的快速和响应式的体验。
相反,我设置了这个coffeescript函数
jQuery ->
if $('a.delete').length
$("a.delete").click ->
if confirm("Are you sure?")
row = $(this).closest("tr").get(0)
$.post @href,
_method: "delete"
, null, "script"
$(row).hide()
false
else
#they clicked no.
false这在99%的情况下都工作得很好。但我发现,当用户快速连续删除几个对象时,会出现一些边缘情况。虽然这些对象是隐藏的,但有些对象似乎没有被正确删除,并在页面重新加载时再次显示。
有没有更好的方法来完成这一点,或者让我的.post请求排队,这样我就可以100%地确信它们都完成了?
发布于 2014-05-01 15:37:09
如果您想要对任务进行排队,您可能需要考虑delayed_job gem https://github.com/collectiveidea/delayed_job。
至于在页面上保留要删除的项目的更好方法,您可以在模型上结合使用delayed_job和"pending_deletion“布尔值字段。当用户指示要删除某个对象时,对其进行标记,提交删除作业,然后运行Coffeescript函数将其隐藏。绘制视图之前的初始查询可以修改为包括pending_delete != true的对象。这对我来说似乎有点多,但如果你的删除过程很慢,或者你的队列经常被备份,这似乎是合理的。
您可能还(或者替代地)希望让您的CoffeeScript函数作为对控制器操作的响应来执行。如果Object.delete返回true,则运行函数并隐藏对象。
https://stackoverflow.com/questions/23403683
复制相似问题