You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用AJAX删除Rails任务项失败:无法隐藏已删除项

解决Rails AJAX删除任务后元素未隐藏的问题

我来帮你排查这个问题,看起来你的AJAX删除逻辑已经走通了,但DOM元素隐藏的环节出了点小问题,咱们一步步来解决:

1. 先修复控制器的destroy方法(关键!)

你当前的destroy方法里缺少了获取任务的代码,如果没有先找到对应的@task,不仅销毁操作可能失败,返回的JSON也会没有id字段,前端自然找不到要隐藏的元素。修改控制器代码:

def destroy
  @task = Task.find(params[:id]) # 新增这行,先定位要删除的任务
  @task.destroy
  render json: @task
end

2. 修正事件绑定方式(适配Turbolinks)

因为你用了Turbolinks,直接绑定在元素上的ajax:success事件只会在第一次页面加载时生效,后续通过Turbolinks加载的页面元素不会触发事件。改用事件委托或者在Turbolinks加载事件里绑定:

修改application.js:

$(document).on('turbolinks:load', function() {
  // 把事件绑定到document上,监听所有删除链接的ajax:success事件
  $(document).on('ajax:success', '.delete', function(event, data) {
    // 直接通过当前点击的删除链接,找到它所在的任务li元素并隐藏
    $(this).closest('[data-js-task-id]').hide();
  });
});

这种方式的好处是,不管任务元素是页面初始加载的还是后续通过AJAX新增的,事件都能正常触发。

3. 规范HTML属性写法

你的li元素的data-js-task-id属性没有加引号,虽然数字ID可能不会出问题,但这不符合HTML规范,也可能在某些场景下导致选择器失效。修改index.html.erb:

<li data-js-task-id="<%= task.id %>" class="task">
  <%= link_to task.title, task, class: "task-title text-dark ml-2" %>
  <%= link_to '', task, remote: true, method: :delete, class:"far fa-trash-alt text-dark icon delete", title: "Delete" %>
</li>

额外优化:简化前端逻辑

之前你通过xhr.responseJSON.id获取任务ID,其实回调函数的第二个参数data就是控制器返回的JSON对象,直接用data.id更简洁。不过上面的方案里我们用closest直接定位元素,连ID都不需要取了,逻辑更简单可靠。

做完这些修改后,再测试删除操作,应该就能正常隐藏对应的任务项了。

内容的提问来源于stack exchange,提问作者user10928060

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 09:15:04