在我的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
会解决这一点。
非常感谢任何指导。
答案 0 :(得分:0)
如果您使用的是标准Rails表单(form_tag
或form_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旨在让您了解我的意思。