【问题标题】:Delete / Destroy using a link and Laravel 5使用链接和 Laravel 5 删除/销毁
【发布时间】:2015-07-05 10:16:42
【问题描述】:

我本可以发誓我曾经有过这个工作,但现在我正在努力弄清楚为什么它不会。我发现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();

})();

【问题讨论】:

  • 您的路线设置如何?如果您无法使脚本正常工作,也许这可能是一种替代方法:barryvdh.nl/laravel/jquery/2015/04/11/…
  • 看起来可以工作,与 bower 一起安装,但我没有使用 application.js,所以没有设置似乎没有记录
  • 我想通了 - 只需添加 rails.js 包含,然后按照包含的说明添加 csrf-token 和 csrf-param 元标记。很好的解决方案。这样做时,我意识到我有一个重复的 js 函数,它与我的新 deleteHandler 冲突。感谢您的帮助。
  • 不客气,很高兴能为您提供帮助!

标签: javascript laravel laravel-5


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2017-01-18
    • 2013-08-02
    • 1970-01-01
    • 2013-11-07
    • 2016-03-21
    • 2015-07-29
    • 1970-01-01
    • 2014-05-10
    • 1970-01-01
    相关资源
    最近更新 更多