2

我正在提交一个简单的 ajax 删除请求,如下所示:

#invitation_actions
  =link_to "delete", invitation_path(invitation), :method=>:delete, :remote=>true, :class=>"remove", :confirm=>'Are you sure you?'

请注意,由于所有页面中都包含 csrf_meta_tag 标记,因此具有请求的页面包含authentity_token。

当我查看日志时,我发现删除请求缺少authentity_token:

在 2011-04-22 11:21:21 -0700 开始 DELETE "/invitations/5" for 127.0.0.1 由 InvitationsController#destroy 作为参数处理:{"id"=>"5"}

现在,如果我从代码中删除“:remote =>:true”,即我执行常规页面加载删除工作,我在日志文件中看到以下内容:

在 2011-04-22 12:52:19 -0700 开始 POST "/invitations/10" for 127.0.0.1 由 InvitationsController#destroy 作为 HTML 参数处理:{"authenticity_token"=>"qlT8uX/WGQeOQSmVZzw1v8rFdSTHDRbzNY0zpSc9mV0=", "id" =>“5”}

为什么在 AJAX 情况下是 DELETE 而在非 AJAX 情况下是 POST?为什么 DELETE 不包含authenticity_token?

谢谢你的帮助。

4

2 回答 2

6

您的问题的第一个可能原因(我能想到的)是,如果您的 UJS 脚本已经使用了两个多月,您可能需要将其更新到最新版本,以便您的应用程序使用 AJAX 发送真实性令牌要求。

这种行为变化发生在 2011 年 2 月,这意味着必须更新所有 Rails UJS 脚本:

http://groups.google.com/group/rubyonrails-security/browse_thread/thread/2d95a3cc23e03665

您问题的第二部分询问在非 AJAX 情况下用于删除的 HTTP POST 动词。这是因为 Rails 必须模拟 REST 表单处理,因为浏览器没有实现所有 4 个 HTTP 动词,例如 GET、POST、PUT 和 DELETE,因为这些动词在 HTML 中无效。

JavaScript (AJAX) 可以做真正的事情,因为它控制发送到您的 AJAX 端点的标头。

于 2011-04-22T20:26:28.060 回答
1

您还需要添加应用程序布局文件的<%= csrf_meta_tag %>内部<head>标记。这个帮助器放置了几个额外<meta>的标签,这些标签是jquery_ujs脚本编写有效的 POST 请求所需的。

于 2013-10-07T16:18:02.043 回答