我正在尝试覆盖backbone的.sync方法,以便让我的Rails API能够正常运行身份验证。我已经离开了this post,我觉得我真的很接近搞清楚了。我设置了导轨侧面,但我在前端遇到了麻烦。我被困在另一个帖子中的部分
var token = YourAppName.csrfToken;
我不太确定如何替换'YourAppName'。这是我到目前为止的主干代码。我的应用程序被称为“Droppin”,当我将其分入时,我会收到错误,说它没有定义。
// overide backbone.sync
Backbone._sync = Backbone.sync;
Backbone.sync = function(method, model, options) {
if (!options.noCSRF) {
var beforeSend = options.beforeSend;
// Set X-CSRF-Token HTTP header
options.beforeSend = function(xhr) {
var token = Droppin.csrfToken;
if (token) xhr.setRequestHeader('X-CSRF-Token', token);
// this will include session information in the requests
xhr.withCredentials = true;
if (beforeSend) return beforeSend.apply(this, arguments);
};
}
var complete = options.complete;
options.complete = function(jqXHR, textStatus) {
// If response includes CSRF token we need to remember it
var token = jqXHR.getResponseHeader('X-CSRF-Token')
if (token) Droppin.csrfToken = token;
model.trigger('sync:end');
if (complete) complete(jqXHR, textStatus);
};
// Serialize data, optionally using paramRoot
if (options.data == null && model && (method === 'create' || method === 'update' || method === 'patch')) {
options.contentType = 'application/json';
data = JSON.stringify(options.attrs || model.toJSON(options));
if (model.paramRoot) {
data = {};
data[model.paramRoot] = model.toJSON(options);
} else {
data = model.toJSON();
}
options.data = JSON.stringify(data);
}
return Backbone._sync(method, model, options);
};
为了获取CSRF令牌并将其正确附加到HTTP标头,我需要做什么?我还应该提到我正在使用require.js并且正在处理main.js文件中的覆盖(不确定这是否是正确的地方)。
答案 0 :(得分:1)
您是否事先在代码中的其他位置定义了Dropping
?例如,
window.Droppin = window.Dropping || {};
如果没有,当您尝试执行var token = Droppin.csrfToken;
Droppin将是未定义的,因此将不具有属性csrfToken