Rails 3简单的AJAX删除无法正常工作,因为authenticity_token不随请求一起发送

时间:2011-04-22 20:07:07

标签: ruby-on-rails ajax ruby-on-rails-3 ujs

我正在提交一个简单的ajax删除请求:

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

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

当我查看日志时,我看到删除请求缺少authenticity_token:

在2011-04-22 11:21:21 -0700开始为127.0.0.1删除“/邀请/ 5”   由InvitationsController处理#dutroy as   参数:{“id”=>“5”}

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

在2011-04-22 12:52:19 -0700为127.0.0.1开始发布“/邀请/ 10”   由InvitationsController处理#销毁为HTML   参数:{“authenticity_token”=>“qlT8uX / WGQeOQSmVZzw1v8rFdSTHDRbzNY0zpSc9mV0 =”,“id”=>“5”}

为什么它是AJAX案例中的DELETE和非AJAX案例中的POST? 为什么DELETE不包含authenticity_token?

感谢您的帮助。

2 个答案:

答案 0 :(得分: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端点的标头。

答案 1 :(得分:1)

此外,您还需要在应用程序布局文件的<%= csrf_meta_tag %>标记内添加<head>。这个助手会为<meta>脚本添加额外的jquery_ujs个标签,以构成有效的POST请求。