使用链接和Laravel 5删除/销毁

时间:2015-04-27 05:12:20

标签: javascript laravel laravel-5

我本来可以发誓我曾经有过一次这样的工作,但是现在我拉着我的头发试图找出它为什么不会这样做。我发现this great script在删除链接旁边插入一个隐藏的表单,然后使用必要的标记提交表单。我在git网站上发布了一条消息,但没有回复。

我完全按照建议设置它并查看DOM我可以看到表单在那里,插入。我已经完成了一些警报,以确保它能正确地看到令牌但每次都得到:

TokenMismatchException in VerifyCsrfToken.php line 46:

如果我把一个旧的标准Laravel删除表单工作正常,我似乎无法让这个脚本像它应该的那样工作。没有其他的javascript错误或我可以找到的问题。

这是我添加到页面顶部代码的脚本:

 <a href="posts/2" data-method="delete"> <---- We want to send an HTTP DELETE request

 - Or, request confirmation in the process -

 <a href="posts/2" data-method="delete" data-confirm="Are you sure?">

 Add this to your view:
<script>
    window.csrfToken = '<?php echo csrf_token(); ?>';
 </script>
<script src="/js/deleteHandler.js"></script>
 */

(function() {

var laravel = {
    initialize: function() {
        this.registerEvents();
    },

    registerEvents: function() {
        $('body').on('click', 'a[data-method]', this.handleMethod);
    },

    handleMethod: function(e) {
        var link = $(this);
        var httpMethod = link.data('method').toUpperCase();
        var form;

        // If the data-method attribute is not PUT or DELETE,
        // then we don't know what to do. Just ignore.
        if ( $.inArray(httpMethod, ['PUT', 'DELETE']) === - 1 ) {
            return;
        }

        // Allow user to optionally provide data-confirm="Are you sure?"
        if ( link.data('confirm') ) {
            if ( ! laravel.verifyConfirm(link) ) {
                return false;
            }
        }

        form = laravel.createForm(link);
        form.submit();

        e.preventDefault();
    },

    verifyConfirm: function(link) {
        return confirm(link.data('confirm'));
    },

    createForm: function(link) {
        var form =
            $('<form>', {
                'method': 'POST',
                'action': link.attr('href')
            });

        var token =
            $('<input>', {
                'name': '_token',
                'type': 'hidden',
                'value': window.csrfToken
            });

        var hiddenInput =
            $('<input>', {
                'name': '_method',
                'type': 'hidden',
                'value': link.data('method')
            });

        return form.append(token, hiddenInput)
            .appendTo('body');
    }
};

laravel.initialize();

})();

1 个答案:

答案 0 :(得分:0)

正如haakym所说,一个解决方案是Unobtrusive JavaScript。在实现的过程中,我意识到我在另一个与我的deleteHandler冲突的js文件中有一个旧版本的删除处理程序。

像往常一样,有很多方法可以实现相同的解决方案。感谢输入haakym。