我正在尝试通过laravel 5中的ajax更新一些数据,但是我正面临MethodNotAllowed Http异常。
因此,我在web.php中创建了资源路由,这是一个HTML表单,用于在文本框中预先填充一些数据以及一些Ajax代码。
用于Web.php的代码,通过管理员为前缀。
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方法不允许异常的情况。
答案 0 :(得分:1)
您正在发布数据。
当您在路由器中发布数据并使用资源时,laravel会调用存储功能,并且您的路由不会让它(['only' => ['edit', 'update', 'index', 'change-language']).
要进行测试,它会将存储功能添加到您的路线中,dd($request);
您可以看到request;
答案 1 :(得分:0)
请勿使用方法=> PUT形式。而是改为
{!! Form::open(['id'=>'editSettings','class'=>'ajax-form','method'=>'POST']) !!}
@method('PUT')
@csrf
//input elements here
{!! Form::close() !!}
您需要更改'method'=>'POST',并添加 @method('PUT')和 @csrf 以上
答案 2 :(得分:0)
假设easyAjax
允许应包含以下内容的数据属性,您将需要从ajax调用中欺骗您的方法:
data: {
'_method' : 'PUT'
},
此外,您将希望包含csrf令牌:
data: {
'_method' : 'PUT',
'_token' : '{{csrf_token()}}'
},
注意:只要脚本是刀片视图的一部分,'{{csrf_token()}}'
就会起作用。如果不是,则使用标题:
headers: {
'X-CSRF-Token': $('meta[name="csrf-token"]').attr('content')
}
如果您需要使用标头来包含csrf令牌,请确保在文档的头部包含meta标签:
<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
})
});
详细了解method spoofing。
答案 3 :(得分:0)
感谢@adam的回答,这正是问题所在。最后,我编写了以下代码以获得预期结果
Field