51

我正在关注 Michael Hartl 的 Rails 教程,出于某种原因,以下代码:

<%= link_to 'delete', user, :method => :delete, :confirm => "You sure?",
                                :title => "Delete #{user.name}" %>

发出 GET 请求(我通过检查 rails 服务器日志进行了验证)。我还验证了以下行在我的应用程序视图中:

<%= javascript_include_tag :all %>

一件事我不太明白,这可能是我问题的根源:“删除”方法在哪里定义?我在Hartl 的源代码中验证了他在控制器中定义了一个“销毁”方法,而不是“删除”。但即使我将 link_to 更改为 :method => :destroy,它也只会发出 GET。

我正在使用 Rails 3.1。有小费吗?

4

7 回答 7

78

还要检查它是否在您的 application.js 中:

//= require jquery
//= require jquery_ujs 

显然我有没有 jquery_ujs 的 jquery,在我添加它之前我遇到了同样的问题。

于 2013-12-27T05:27:51.570 回答
52

大多数浏览器实际上并不支持 DELETE 动词,因此 Rails 通过修改它生成的 HTML 来伪造它。Rails 添加了一个名为的 HTML5 属性data-method并将其设置为"delete". 因此,当用户单击链接时,它实际上是作为GET请求发出的,但是该data-method属性允许使用一些 Rails 魔法,并且意味着您的路由代码应该将其识别为 DELETE 请求。

编辑:

您可以在控制台中自行测试。运行bundle exec rails c进入控制台,查看生成的 HTML:

helper.link_to "delete", "foobar/delete", :method => 'delete'

HTML 应如下所示:

<a href="foobar/delete" data-method="delete" rel="nofollow">delete</a>
于 2011-09-19T02:36:14.417 回答
15

您应该使用以下代码

<%= button_to "delete", @user_current, :method => "delete" %>

它将解决问题或将此行添加 //= require jquery_ujs 到 application.js 并使用:

 <%= link_to 'delete', user, :method => :delete, data: {:confirm => "You sure?" } ,
                            :title => "Delete #{user.name}" %>
于 2015-02-13T00:08:23.027 回答
4

由于浏览器不支持DELETE动词,Rails 通过模拟DELETE通过标准GETPOST. 工作方式method: :delete是为所有修改请求的链接使用 JavaScript 处理程序,data-method="delete"以便 Rails 将其作为DELETE处理。此 JavaScript 处理程序由jquery_ujs库提供。

有几件事可能出错:

  1. 确保您同时拥有jqueryjquery_ujs包含在您的application.js. 没有这两者,什么都不会处理数据属性。
  2. 确保有问题的链接确实具有method: :delete指定的选项。
  3. 确保由于某种原因您没有停止相关链接的事件传播,例如:
$( 'a' ).click( function( event ) {
    event.stopPropagation()
})

因为这会阻止jquery_ujs处理程序被执行,并且请求永远不会被修改,并且仍然只是一个标准的 GET。

于 2017-09-20T11:34:49.557 回答
2

我在迈克尔的教程中遇到了同样的问题。实际上按预期工作 - 它确实调用了控制器中的data-method="delete"销毁操作。它尝试GET(并最终失败)的原因如下:

您会注意到before_filter控制器中的 ' 之一设置为signed_in_user,并且在 中session_helper.rb,您会注意到signed_in_user调用store_location(私有方法),它更新session[:return_to]为当前 URL。

因此,回到控制器的销毁操作,它会尝试redirect_back_or导致GET current_url. 我将signed_in_user助手修改为仅store_location在用户尚未登录时调用。

于 2012-04-06T03:26:33.313 回答
1

在轨道 5 上:

有同样的问题,所有的“删除”帖子都被泄露了,影响了我的 crud 页面并设计了注销......为了解决这个问题,我所要做的就是:

//= 需要 rails-ujs

于 2018-07-19T14:23:09.207 回答
0

我们只需要添加以下代码行

//= require jquery_ujs 

这似乎是一个错误:))

于 2019-10-18T12:13:56.163 回答