首页 > 解决方案 > 无法使用 Ruby on rails 删除表中的项目

问题描述

我试图从我使用脚手架生成的表中删除一个项目。我做了一些研究,发现这是 Windows 机器的一个常见问题,它不会删除它只是获取它的项目。这是我在控制器中的销毁方法

 def destroy
    @measurment.destroy
    respond_to do |format|
      format.js
      format.html { redirect_to measurments_url, notice: "Measurment was successfully destroyed." }
      format.json { head :no_content }
    end
  end

这是我在下面尝试的修复。我在索引页面的销毁链接中添加了 remote: true 和 class: "delete"

<td><%= link_to 'Destroy', measurment, method: :delete, data: { confirm: 'Are you sure?', remote: true }, class: "delete" %></td>
      </tr>
  

然后我使用 yarn add jquery 添加 jquery 并添加 //= require jquery //= require rails-ujs 到 application.js 文件。最后,我在测量文件夹中创建了一个名为 destroy.js.erb 的文件。这包含:

$('.delete').bind('ajax:success', function(){
    $(this).closest('tr').fadeOut();
});

毕竟我仍然不能从表中删除项目。任何帮助将不胜感激

标签: jqueryruby-on-railsrubydatabasesqlite

解决方案


如果您使用服务器生成的 JavaScript 响应 (SJR),您希望直接执行操作而不是添加事件处理程序:

<%= link_to 'Destroy', measurment, method: :delete, data: { confirm: 'Are you sure?', remote: true }, class: "delete", id: "measurment-#{measurment.id}" %>
$("#measurment-<%= @meaurement.id %>").closest('tr')
                                     .fadeOut();

SJR 的工作方式是将返回的 javascript 弹出到脚本标记中,并在请求完成后立即执行。然而,这段代码完全不知道是哪个元素触发了原始事件,所以你必须得到 hacky 和唯一的 id。

如果您改为发送 JSON 请求,您可以编写更好的 javascript,而不是让您的服务器负责更改页面。

<%= link_to 'Destroy', measurment, method: :delete, 
            data: { 
              confirm: 'Are you sure?', 
              remote: true, 
              type: 'json' 
            }, class: "delete" %>

// place this code in your packs or the assets pipeline
$(document).on('ajax:success', '.delete', function(){
  $(this).closest('tr').fadeOut();
});

推荐阅读