所以这与另一个SO问题(Why does destroy action trigger HTTP authentication in Production in Rails 3?)有关,我认为这是问题的核心,但不知道该怎么做。
显然我的$.destroy()
未被传递必需的CSRF令牌。
但我不确定如何加入它。
这是我的JS:
var compv = {
exists: true,
tools: {
exists: true,
csrf_param: null,
csrf_token: function() { },
clientError: function() { }
},
comments: {
exists: true,
updateView: null,
selectImage: null,
upvote: null,
edit: null,
cancelEdit:null,
downvote: null,
showVotes: null,
destroy: {
success: null,
error: null,
dialog: 'comment-destroy-dialog'
},
getUploadID: function(element) {
return $(element).parents("li").attr("data-upload-id");
}
},
steps: {
exists: true,
selectFn: {},
selectedClass: "selected-step",
selectableClass: "selectable-step",
selectedClient: {
element: null,
id: null,
stepType: "client",
ajaxSuccess: null
},
selectedProject: {
element: null,
id: null,
stepType: "project",
ajaxSuccess: null
},
selectedStage: {
element: null,
id: null,
stepType: "stage",
ajaxSuccess: null,
getID: function() {
return compv.steps.selectedStage.id;
},
displayCompare: function() {
window.open($(this).attr('data-url'), "_blank");
}
},
selectedUpload: {
element: null,
id: null,
stepType: "image",
primeUploadDisplay: null,
ajaxSuccess: null,
uploader: null,
noCloseDialog: false
}
}
};
compv.tools.csrf_param = function(){
return $('meta[name=csrf-param]').attr('content');
};
compv.tools.csrf_token = function(){
return $('meta[name=csrf-token]').attr('content');
};
这是我的$.destroy()
$.destroy({
url: element.attr('data-destroy-url'),
success: mapping.success
});
鉴于我在上述函数中获取了相应的csrf元数据,我如何将其传递给.destroy()?
我尝试添加compv.tools.csrf_token
,但我得到的错误是compv
未定义。当我做compv.tools.csrf_token()
时发生了同样的事情。
想法?
答案 0 :(得分:0)
查看Rails(或in the jQuery version here)附带的handleMethod
中的public/javascripts/rails.js
- 两者都会向您展示Rails如何包含令牌。
如果你想使用自己的自定义destroy
电话,那么你需要自己做这些事情。
答案 1 :(得分:0)
将csrf函数的结果抛出到对象中,并将该对象传递给data属性。至少这在过去对我有用。
var data = {};
data[compv.tools.csrf_param()] = compv.tools.csrf_token();
$.destroy({
url: element.attr('data-destroy-url'),
success: mapping.success,
data: data
});