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

标签 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 删除“/invitations/5” 由 InvitationsController 处理#destroy as 参数:{"id"=>"5"}

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

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

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

感谢您的帮助。

最佳答案

您的问题的第一个可能原因(我能想到的)是,如果您的 UJS 脚本已超过几个月,您可能需要将其更新到最新版本,以便您的应用程序发送真实性带有 AJAX 请求的 token 。

这种行为变化发生在 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 端点的 header 。

关于ruby-on-rails - Rails 3 简单的 AJAX 删除不起作用,因为 authenticity_token 没有随请求一起发送,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5759574/

相关文章:

ruby-on-rails - 设计与 devise_token_auth : How to handle authentication for both a web app and API

ruby-on-rails - Ruby on Rails 事件的嘉宾

html - 在 rails 3 的 iframe 中呈现部分内容

ruby-on-rails-3 - Rake::TestTask 没有运行 minitest 文件

ruby-on-rails - rake 数据库 :migrate (mysql)

javascript - 在 Rails 中加载异步 js 文件(使用 JQuery)

javascript - 使用 JQuery 从具有 JSON 值的表中选择行

javascript - 从 Web UI 与本地 Perl 脚本交互

jquery - 上传文件+表单数据+Spring MVC + JQuery

ruby-on-rails - 在 Rails 3 中,如何获取 Controller `index` 操作的路径?