方法不允许 (PUT) With AJAX Call in Laravel 5.2
Method not allow (PUT) With AJAX Call in Laravel 5.2
我的Blade是:
{!! Form::open(['method' => 'PUT', 'id' => 'confirmTCU',
'action' => ['TournamentUserController@confirmUser', $tournament->slug, $categoryTournament->id,$user->slug ]]) !!}
它生成我的表格:
<form method="POST" action="http://laravel.dev/tournaments/bisque/categories/1/users/admin/confirm" accept-charset="UTF-8" id="confirmTCU">
<input name="_method" type="hidden" value="PUT">
<input name="_token" type="hidden" value="tiaIHtctMbo1NwbEK8TqoKOyrN8ZSyeQELSyYL9A">
<button type="submit" class="btn btn-flat text-warning-600 btnConfirmTCU" id="confirm_bisque_1_admin" data-tournament="bisque" data-category="1" data-user="admin">
<i class="text-danger glyphicon glyphicon-remove-sign"></i>
</button>
</form>
我的 AJAX 是:
$('.btnConfirmTCU').on('click', function (e) {
e.preventDefault();
$(this).prop("disabled", true);
var inputData = $('#formDeleteTCU').serialize();
//var tournamentSlug = $(this).data('tournament');
var categoryId = $(this).data('category');
var userSlug = $(this).data('user');
$.ajax(
{
type: 'PUT',
url: url + '/categories/' + categoryId + '/users/' + userSlug + '/confirm',
data: inputData,
success: function (data) {
...
},
error: function (data) {
...
}
}
)
});
我的路线是:
Route::put('tournaments/{tournamentId}/categories/{categoryTournamentId}/users/{userId}/confirm', 'TournamentUserController@confirmUser');
我的控制器是:
public function confirmUser($tournamentSlug, $tcId, $userSlug)
{
$user = User::findBySlug($userSlug);
$ctu = CategoryTournamentUser::where('category_tournament_id', $tcId)
->where('user_id', $user->id)->first();
$ctu->confirmed ? $ctu->confirmed = 0 : $ctu->confirmed = 1;
$ctu->save();
return redirect("tournaments/$tournamentSlug/users");
}
我看到了很多关于它的话题,但是 none 解决了我的问题。
由于大多数浏览器不允许 PUT,Laravel 像 POST 一样发送它,但包括一个带有 PUT 值的隐藏字段 _method。
此外,我可以执行 DELETE 操作,但不能执行 PUT...
此外,该方法在不使用 AJAX 时效果完美。
我的问题在哪里???
将您的 ajax 类型从 'PUT' 更改为 'POST',Laravel 将读取您的参数“_method”并将 'POST' 视为 'PUT'.
您的代码应该可以正常工作,但看起来您正在序列化错误的表单。您当前的代码显示 var inputData = $('#formDeleteTCU').serialize();
,但您显示的表单的 ID 是 confirmTCU
。
我的Blade是:
{!! Form::open(['method' => 'PUT', 'id' => 'confirmTCU',
'action' => ['TournamentUserController@confirmUser', $tournament->slug, $categoryTournament->id,$user->slug ]]) !!}
它生成我的表格:
<form method="POST" action="http://laravel.dev/tournaments/bisque/categories/1/users/admin/confirm" accept-charset="UTF-8" id="confirmTCU">
<input name="_method" type="hidden" value="PUT">
<input name="_token" type="hidden" value="tiaIHtctMbo1NwbEK8TqoKOyrN8ZSyeQELSyYL9A">
<button type="submit" class="btn btn-flat text-warning-600 btnConfirmTCU" id="confirm_bisque_1_admin" data-tournament="bisque" data-category="1" data-user="admin">
<i class="text-danger glyphicon glyphicon-remove-sign"></i>
</button>
</form>
我的 AJAX 是:
$('.btnConfirmTCU').on('click', function (e) {
e.preventDefault();
$(this).prop("disabled", true);
var inputData = $('#formDeleteTCU').serialize();
//var tournamentSlug = $(this).data('tournament');
var categoryId = $(this).data('category');
var userSlug = $(this).data('user');
$.ajax(
{
type: 'PUT',
url: url + '/categories/' + categoryId + '/users/' + userSlug + '/confirm',
data: inputData,
success: function (data) {
...
},
error: function (data) {
...
}
}
)
});
我的路线是:
Route::put('tournaments/{tournamentId}/categories/{categoryTournamentId}/users/{userId}/confirm', 'TournamentUserController@confirmUser');
我的控制器是:
public function confirmUser($tournamentSlug, $tcId, $userSlug)
{
$user = User::findBySlug($userSlug);
$ctu = CategoryTournamentUser::where('category_tournament_id', $tcId)
->where('user_id', $user->id)->first();
$ctu->confirmed ? $ctu->confirmed = 0 : $ctu->confirmed = 1;
$ctu->save();
return redirect("tournaments/$tournamentSlug/users");
}
我看到了很多关于它的话题,但是 none 解决了我的问题。
由于大多数浏览器不允许 PUT,Laravel 像 POST 一样发送它,但包括一个带有 PUT 值的隐藏字段 _method。
此外,我可以执行 DELETE 操作,但不能执行 PUT...
此外,该方法在不使用 AJAX 时效果完美。
我的问题在哪里???
将您的 ajax 类型从 'PUT' 更改为 'POST',Laravel 将读取您的参数“_method”并将 'POST' 视为 'PUT'.
您的代码应该可以正常工作,但看起来您正在序列化错误的表单。您当前的代码显示 var inputData = $('#formDeleteTCU').serialize();
,但您显示的表单的 ID 是 confirmTCU
。