Rails - 401(未授权)错误 - 使用AJAX控制器的JSON

时间:2016-06-23 19:10:30

标签: ruby-on-rails ajax

在我的Rails应用程序中,我试图通过AJAX将JSON传递给控制器​​,但是我遇到了401 (unauthorized)错误。我一直在研究这个并试图弄清楚我做错了什么,但我不能说。

首先,AJAX本身 -

$.ajax({
    url: "report/submission",
    type: "POST",
    beforeSend: function(xhr) {xhr.setRequestHeader("X-CSRF-Token", $("meta[name='csrf-token']").attr("content"))},
    data: {"report" : reportParameter}
});

这会将数据传递给submission控制器中的Report操作 -

class ReportController < ApplicationController

    before_action :authenticate_user!, :only => [:submission]

    def submission
      INSERT ENTRIES TO DB, ETC
    end

end

所以也许一个复杂的因素是我需要before_action Devise登录。

所以基本过程是,用户完成表单,条目被组装成JSON(reportParameter),然后传递给submission动作,需要成功登录才能完成(我知道这似乎是倒退,但对于这个特定的应用程序来说是必要的。)

我的布局包含<%= csrf_meta_tags %>,我在protect_from_forgery with: :null_session控制器中设置application

我必须承认,我不太了解这一点,以便更具洞察力 - 我知道这是与CSRF令牌相关的授权问题,但我认为在AJAX中设置beforeSend会解决这一点。

非常感谢任何指导。

1 个答案:

答案 0 :(得分:0)

如果您使用的是标准Rails表单(form_tagform_for),那么使用jquery-ujs就是一种简单的方法。它通常默认为application.js

# application.js
//= require jquery_ujs

它会自动处理CSRF令牌并添加到jQuery的ajax方法(您手动执行的操作)。

如果您不想将application.js个文件包含在您的网页中,那么您只需添加jquery-ujs.js个文件。

如果你也不想这样做,那么我唯一能想到的就是你的表格正在使用&#34; old&#34;或者&#34;不是最新的&#34; csrf令牌(缓存的表单可能有它们)。然后,确保您的隐藏表单中的csrf标记未提交或与您在请求标头中发送的标记相匹配。 Here旨在让您了解我的意思。