根据 AJAX 请求设计注销用户。导轨 3.1

Posted

技术标签:

【中文标题】根据 AJAX 请求设计注销用户。导轨 3.1【英文标题】:Devise Logging User out on AJAX request. Rails 3.1 【发布时间】:2011-11-08 03:09:48 【问题描述】:

我有一个使用 AJAX 进行 CRUD 的控制器,但是每当我单击我的远程链接之一(例如删除)时,我看到 rails 服务器已决定将我注销并重定向我。对服务器日志的检查表明它无法验证 CSRF 真实性。如何在我的请求中包含 CSRF 令牌?

运行: - 导轨 3.1 - 设计 1.4.4 - jquery-rails 1.0.13

相关控制器动作:

 def destroy
     @article = Article.find(params[:id])
      if @article.destroy
        flash[:notice] = "Article deleted."
        respond_to do |format|
        format.htmlredirect_to articles_path
        format.js
      end
      else
        flash[:error] = "Try Again."
        redirect_to :back
      end

布局/application.html.erb

      <head>
    <title><%= content_for?(:title) ? yield(:title) : "Untitled" %></title>
<link rel="stylesheet" href="http://twitter.github.com/bootstrap/assets/css/bootstrap-1.1.1.min.css>
    <%= stylesheet_link_tag "application" %>
    <%= javascript_include_tag :defaults %>
   <script type="text/javascript">jQuery.ajaxSetup( beforeSend: function (xhr)  xhr.setRequestHeader("Accept", "text/javascript");  );</script>
    <%= csrf_meta_tag %>
    <%= yield(:head) %>
  </head>

提前致谢。

【问题讨论】:

【参考方案1】:

Rails 3.1 使用 gem 'jquery-rails',它希望你在 application.js 文件中有这个:

//= require jquery
//= require jquery_ujs

我忘记了 jquery_ujs 并且遇到了和你一样的问题。

【讨论】:

【参考方案2】:

你的 html 页面中应该有这个:

<%= csrf_meta_tag %>

生成以下内容:

<meta name="csrf-param" content="authenticity_token"/>
<meta name="csrf-token" content="the token comes here"/>

每当您进行 POST(DELETE、PUT 实际上是 POST,但依赖于 _method 设置)时,您应该将 authenticity_token: "the token comes here" 与您的帖子一起包含在数据中。

【讨论】:

是的,确保你的布局中有这个。 我有,这很奇怪。 我已经包含了来自 application.html.erb 的头部 让您在 ajax 调用中一起发送令牌? 我相信这取决于 rails.js。

以上是关于根据 AJAX 请求设计注销用户。导轨 3.1的主要内容,如果未能解决你的问题,请参考以下文章

Grails:运行ajax请求时用户注销

注销请求应该设计为 GET 还是 POST?

导轨设计,没有路线匹配注销

Ajax PUT 请求导致 Rails 应用程序注销。为啥?

并发请求未完成时无法注销设计用户

Safari 5.1 基本身份验证注销问题