我正在提交一个简单的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请求。