在 Laravel AJAX POST 请求后出现 422 无法处理的实体错误
422 Unprocessable Entity error after AJAX POST request in Laravel
在我的网站上,用户可以回复博文。
回复时页面刷新有点烦人,所以我决定试试ajax。但是,我遇到了一个错误。
Form/markup:
<form data-value="{{$status->id}}" class="replyForm" role="form" action="{{ route('status.reply', ['statusId' => $status->id]) }}" method="post">
<div class="form-group">
<textarea name="reply-{{$status->id}}" class="form-control" placeholder="Reply to this status"></textarea>
@if ($errors->has("reply-{$status->id}"))
<span class="help-block">
{{ $errors->first("reply-{$status->id}") }}
</span>
@endif
</div>
<input type="submit" value="Reply">
<input type="hidden" name="_token" value="{{ Session::token() }}" >
</form>
控制器:
public function postReply(Request $request, $statusId) {
$this->validate($request, [
"reply-{$statusId}" => 'required|max:1000|alpha_dash',
], [
'required' => 'The reply body is required.'
]);
$status = Status::notReply()->find($statusId);
if (!$status) {
return redirect()->route('home');
}
if (!Auth::user()->isFollowing($status->user) && Auth::user()->id !== $status->user->id){
return redirect()->route('home');
}
$reply = Status::create([
'body' => $request->input("reply-{$statusId}"),
])->user()->associate(Auth::user());
$status->replies()->save($reply);
return redirect()->back();
}
路线:
Route::post('/status/{statusId}/reply', [
'uses' => '\CommendMe\Http\Controllers\StatusController@postReply',
'as' => 'status.reply',
'middleware' => ['auth'],
]);
现在一切正常。但是,当我尝试将其转换为 Ajax 请求时:
$( ".replyForm" ).submit(function( e ) {
e.preventDefault();
var $token = $('input[name=_token]').val();
var dataString = $(this).serialize();
var $replyValue = $(this).attr('data-value');
$.ajax({
type: "POST",
url: host + '/status/' + $replyValue + '/reply',
data: {replyValue: $replyValue, _token:$token},
success: function(res) {
}
});
});
我收到以下错误:
POST XHR http://localhost/status/41/reply [HTTP/1.1 422 Unprocessable
Entity 184ms]
41 是被回复状态的 ID。
这是什么原因造成的?
从验证来看,您似乎希望 reply-41
作为输入字段。
"reply-{$statusId}" => 'required|max:1000|alpha_dash',
但是,从您提出的 ajax 请求来看,您似乎正在 replyValue
中传递数据
data: {replyValue: $replyValue, _token:$token},
因此,验证规则失败,因为需要 reply-41
。
您可以将服务器端更新为期望 replyValue
而不是 reply-{$statusId}
来解决它:
"replyValue" => 'required|max:1000|alpha_dash',
// ...
'body' => $request->input("replyValue"),
在我的网站上,用户可以回复博文。
回复时页面刷新有点烦人,所以我决定试试ajax。但是,我遇到了一个错误。
Form/markup:
<form data-value="{{$status->id}}" class="replyForm" role="form" action="{{ route('status.reply', ['statusId' => $status->id]) }}" method="post">
<div class="form-group">
<textarea name="reply-{{$status->id}}" class="form-control" placeholder="Reply to this status"></textarea>
@if ($errors->has("reply-{$status->id}"))
<span class="help-block">
{{ $errors->first("reply-{$status->id}") }}
</span>
@endif
</div>
<input type="submit" value="Reply">
<input type="hidden" name="_token" value="{{ Session::token() }}" >
</form>
控制器:
public function postReply(Request $request, $statusId) {
$this->validate($request, [
"reply-{$statusId}" => 'required|max:1000|alpha_dash',
], [
'required' => 'The reply body is required.'
]);
$status = Status::notReply()->find($statusId);
if (!$status) {
return redirect()->route('home');
}
if (!Auth::user()->isFollowing($status->user) && Auth::user()->id !== $status->user->id){
return redirect()->route('home');
}
$reply = Status::create([
'body' => $request->input("reply-{$statusId}"),
])->user()->associate(Auth::user());
$status->replies()->save($reply);
return redirect()->back();
}
路线:
Route::post('/status/{statusId}/reply', [
'uses' => '\CommendMe\Http\Controllers\StatusController@postReply',
'as' => 'status.reply',
'middleware' => ['auth'],
]);
现在一切正常。但是,当我尝试将其转换为 Ajax 请求时:
$( ".replyForm" ).submit(function( e ) {
e.preventDefault();
var $token = $('input[name=_token]').val();
var dataString = $(this).serialize();
var $replyValue = $(this).attr('data-value');
$.ajax({
type: "POST",
url: host + '/status/' + $replyValue + '/reply',
data: {replyValue: $replyValue, _token:$token},
success: function(res) {
}
});
});
我收到以下错误:
POST XHR http://localhost/status/41/reply [HTTP/1.1 422 Unprocessable Entity 184ms]
41 是被回复状态的 ID。
这是什么原因造成的?
从验证来看,您似乎希望 reply-41
作为输入字段。
"reply-{$statusId}" => 'required|max:1000|alpha_dash',
但是,从您提出的 ajax 请求来看,您似乎正在 replyValue
data: {replyValue: $replyValue, _token:$token},
因此,验证规则失败,因为需要 reply-41
。
您可以将服务器端更新为期望 replyValue
而不是 reply-{$statusId}
来解决它:
"replyValue" => 'required|max:1000|alpha_dash',
// ...
'body' => $request->input("replyValue"),