Rails 3简单的AJAX删除不起作用,因为authenticity_token没有随请求一起发送



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

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

请注意,具有请求的页面包含authenticity_token,这要归功于所有页面中包含的csrf_meta_tag标记。

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

开始删除"/invitation/5" for 127.0.0.1 at 2011-04-22 11:21:21 -0700由invitationscontroller# destroy as处理参数:{"id"=>"5"}

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

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

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

谢谢你的帮助

你的问题的第一个可能的原因(我能想到的)是,如果你的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 &删除,因为这些动词在HTML中无效。

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

您还需要在应用程序布局文件的<head>标记中添加<%= csrf_meta_tag %>。这个帮助器放置了jquery_ujs脚本所需的两个额外的<meta>标记来组成有效的POST请求。

相关内容

  • 没有找到相关文章

最新更新