如何将我的csrf令牌添加到我的$ .destroy中 - 在Rails 3&使用Javascript

时间:2011-04-21 05:24:07

标签: javascript jquery ruby-on-rails ruby-on-rails-3 csrf

所以这与另一个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()时发生了同样的事情。

想法?

2 个答案:

答案 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
    });