我在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%确信他们完成所有操作?
答案 0 :(得分:0)
如果要对任务进行排队,可能需要考虑delayed_job gem https://github.com/collectiveidea/delayed_job。
至于将更好的方法保留在页面上以便删除,您可以将delayed_job与&#34; pending_deletion&#34;模型上的布尔字段。当用户指示要删除对象时,将其标记,提交删除作业,然后运行Coffeescript函数将其隐藏。绘制视图之前的初始查询可以修改为包含pending_delete!= true的对象。这对我来说有点像,但如果您的删除过程很慢或者您的队列经常备份,那么这似乎是合理的。
您也可能(或者)想要考虑将CoffeeScript函数作为对控制器操作的响应来执行。如果Object.delete返回true,则运行该函数并隐藏该对象。