为了账号安全,请及时绑定邮箱和手机立即绑定

方法不允许 Http 异常 Ajax 请求

方法不允许 Http 异常 Ajax 请求

PHP
繁星点点滴滴 2021-08-28 18:45:46
我正在尝试通过 laravel 5 中的 ajax 更新一些数据,但我面临 MethodNotAllowed Http 异常。所以,我在 web.php 中创建了一个资源路由,一个 HTML 表单,用于在文本框中预填充一些数据,以及一些 ajax 代码。Web.php 的代码,前缀为 admin。Route::resource('settings', 'OrganisationSettingsController', ['only' => ['edit', 'update', 'index', 'change-language']]);Html 表单代码{!! Form::open(['id'=>'editSettings','class'=>'ajax-form','method'=>'PUT']) !!}//Input Elements Goes Here...                                    {!! Form::close() !!} Ajax 调用代码$('#save-form').click(function () {    $.easyAjax({        url: '{{ route('admin.settings.update', ['1']) }}',        container: '#editSettings',        type: "POST",        redirect: true,        file: (document.getElementById("logo").files.length != 0 || document.getElementById("login_background").files.length != 0) ? true : false    })});当用户单击更新按钮时,数据必须更新,但我在浏览器的控制台中得到了 http 方法不允许异常。
查看完整描述

3 回答

?
ibeautiful

TA贡献1993条经验 获得超5个赞

您将需要从 ajax 调用中欺骗您的方法,假设easyAjax允许它应包括的数据属性:


data: {

    '_method' : 'PUT'

},

此外,您需要包含您的 csrf 令牌:


data: {

    '_method' : 'PUT',

    '_token' : '{{csrf_token()}}'

},

注意: '{{csrf_token()}}'只要脚本是刀片视图的一部分,就可以工作。如果没有,则使用标题:


headers: {

    'X-CSRF-Token': $('meta[name="csrf-token"]').attr('content')

}

如果您需要使用标头来包含您的 csrf 令牌,请确保在文档的头部部分包含元标记:


<meta name="csrf-token" content="{{ csrf_token() }}">

完整的解决方案:


$('#save-form').click(function () {

    $.easyAjax({

        url: '{{ route('admin.settings.update', ['1']) }}',

        container: '#editSettings',

        type: "POST",

        data: {

          '_method' : 'PUT',

          '_token' : '{{csrf_token()}}'

        },

        redirect: true,

        file: (document.getElementById("logo").files.length != 0 || 

        document.getElementById("login_background").files.length != 0) ? true : false

    })

});


查看完整回答
反对 回复 2021-08-28
?
慕田峪9158850

TA贡献1794条经验 获得超7个赞

您正在发布数据。当您在路由器中发布数据并使用资源时,laravel 会调用 store 函数,而您的路由不允许(['only' => ['edit', 'update', 'index', 'change-language']).

为了测试它,将商店功能添加到您的路线中,dd($request);您可以看到您的request;


查看完整回答
反对 回复 2021-08-28
?
蝴蝶刀刀

TA贡献1801条经验 获得超8个赞

这正是问题所在。最后我写了下面的代码来得到预期的结果


$('#save-form').click(function () {

        $.easyAjax({

            url: '{{ route('admin.settings.update', ['1']) }}',

            container: '#editSettings',

            type: "POST",

            data: {

                'company_name': $('#company_name').val(),

                'company_email': $('#company_email').val(),

                'company_phone': $('#company_phone').val(),

                'website': $('#website').val(),

                'address': $('#address').val(),

                'currency_id': $('#currency_id').val(),

                'timezone': $('#timezone').val(),

                'locale': $('#locale').val(),

                'latitude': $('#latitude').val(),

                'longitude': $('#longitude').val(),

                '_method' : 'PUT',

                '_token' : '{{csrf_token()}}'

            },

            redirect: true,

            file: (document.getElementById("logo").files.length != 0 || document.getElementById("login_background").files.length != 0) ? true : false

        })

    });


查看完整回答
反对 回复 2021-08-28
  • 3 回答
  • 0 关注
  • 118 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信