Laravel 5.7 : 更新方法 return "No message"
Laravel 5.7 : Update method return "No message"
我已经尝试了所有方法,但我无法弄清楚我的错误在哪里。
update() 方法不更新任何东西,我只返回 "No message" 错误...
这是 web.php 中的路线:
Route::get('/user/edit/{id}', ['as' => 'users.edit', 'uses' => 'UserAdController@edit']);
Route::post('/user/update/{id}', ['as' => 'users.update', 'uses' =>'UserAdController@update']);
视图 users/edit.blade.php :
<div class="container">
<br>
<h3>Edit your ad</h3>
<br>
<form method="post" action="{{route('users.update', $ad->id)}}">
<input name="_method" type="hidden" value="PATCH">
{{ method_field('post') }}
<div class="form-group">
<label for="title">Title</label>
<input type="text" name="title" class="form-control" id="title" value="{{$ad->title}}">
</div>
<div class="form-group">
<label for="title">Price</label>
<input type="text" name="price" class="form-control" id="title" value="{{$ad->price}}">
</div>
<div class="form-group">
<label for="content">Your content</label>
<textarea name="content" class="form-control" id="content" rows="3">{{$ad->content}}</textarea>
</div>
<div class="form-group">
<input type="submit" value="Update" class="btn btn-info">
</div>
</form>
</div>
@endsection
从 UserAdController 更新方法:
public function update($id, Request $request){
$request->validate([
'title'=>'required',
'price'=> 'required|integer',
'content' => 'required'
]);
$data = \App\Ad::find($id);
$data->title = $request->get('title');
$data->price = $request->get('price');
$data->content = $request->get('content');
$data->save();
return redirect()->back()->with('success', 'Data updated');
}
试试这个
public function update(Request $request){
//your code here
}
Request->only() returns 一个只有一个元素的数组,而验证器是处理传入请求验证的最常用方法。
use Validator;
public function update(Request $request, $id){
$v = validator($request->only('title', 'price', 'content'), [
'title' => 'required|string|max:255',
'price' => 'required|integer',
'content' => 'required',
]);
$data = request()->only('title','price','content');
$userData = ([
'title' => $data['title'],
'price' => $data['price'],
'content' => $data['content'],
]);
$data = \App\Ad::find($id);
$data->update($userData);
return response()->json($data);
}
我不是 laravel 开发者。我只是偶然发现了文档。你还应该将 csrf 字段添加到你的 blade
在edit.blade.php
中,在开始<form>
标签后添加这个
{{csrf_field()}}
还有你update方法中的参数排列不合理
应该是
public function update(Request $request, $id) {
}
第二个参数($id
)来自您在 web.php
文件
中定义的路由
Route::post('/user/update/{id}', ['as' => 'users.update', 'uses' =>'UserAdController@update']);
其中 {id}
将替换为原来的 id
谢谢大家!!
看来我做的不对。
我需要在编辑表单中添加 {{csrf_field()}}
并使用 $request->only()
我认为如果你使用这样的 put 方法会更好:
Route::put('ad/{ad}', ['as' => 'users.update', 'uses' =>'UserAdController@update']);
将您的表单更新为如下所示:
<div class="container">
<br>
<h3>Edit your ad</h3>
<br>
<form method="post" action="{{route('users.update', ['ad' => $ad->id])}}">
<input name="_method" type="hidden" value="PATCH">
{{ method_field('put') }}
{{ csrf_field() }}
<div class="form-group">
<label for="title">Title</label>
<input type="text" name="title" class="form-control" id="title" value="{{$ad->title}}">
</div>
<div class="form-group">
<label for="title">Price</label>
<input type="text" name="price" class="form-control" id="title" value="{{$ad->price}}">
</div>
<div class="form-group">
<label for="content">Your content</label>
<textarea name="content" class="form-control" id="content" rows="3">{{$ad->content}}</textarea>
</div>
<div class="form-group">
<input type="submit" value="Update" class="btn btn-info">
</div>
</form>
现在是您的更新功能:
public function update(\App\Ad $ad, Request $request){
$request->validate([
'title'=>'required',
'price'=> 'required|integer',
'content' => 'required'
]);
//$data = \App\Ad::find($id);
$ad->update([
"title" => $request->title,
"price" => $request->price,
"content" => $request->content,
]);
return redirect()->back()->with('success', 'Data updated');
}
当您习惯放置、删除和修补方法时,您可以阅读 Route::resource 并且您的代码会更容易。
我已经尝试了所有方法,但我无法弄清楚我的错误在哪里。
update() 方法不更新任何东西,我只返回 "No message" 错误...
这是 web.php 中的路线:
Route::get('/user/edit/{id}', ['as' => 'users.edit', 'uses' => 'UserAdController@edit']);
Route::post('/user/update/{id}', ['as' => 'users.update', 'uses' =>'UserAdController@update']);
视图 users/edit.blade.php :
<div class="container">
<br>
<h3>Edit your ad</h3>
<br>
<form method="post" action="{{route('users.update', $ad->id)}}">
<input name="_method" type="hidden" value="PATCH">
{{ method_field('post') }}
<div class="form-group">
<label for="title">Title</label>
<input type="text" name="title" class="form-control" id="title" value="{{$ad->title}}">
</div>
<div class="form-group">
<label for="title">Price</label>
<input type="text" name="price" class="form-control" id="title" value="{{$ad->price}}">
</div>
<div class="form-group">
<label for="content">Your content</label>
<textarea name="content" class="form-control" id="content" rows="3">{{$ad->content}}</textarea>
</div>
<div class="form-group">
<input type="submit" value="Update" class="btn btn-info">
</div>
</form>
</div>
@endsection
从 UserAdController 更新方法:
public function update($id, Request $request){
$request->validate([
'title'=>'required',
'price'=> 'required|integer',
'content' => 'required'
]);
$data = \App\Ad::find($id);
$data->title = $request->get('title');
$data->price = $request->get('price');
$data->content = $request->get('content');
$data->save();
return redirect()->back()->with('success', 'Data updated');
}
试试这个
public function update(Request $request){
//your code here
}
Request->only() returns 一个只有一个元素的数组,而验证器是处理传入请求验证的最常用方法。
use Validator;
public function update(Request $request, $id){
$v = validator($request->only('title', 'price', 'content'), [
'title' => 'required|string|max:255',
'price' => 'required|integer',
'content' => 'required',
]);
$data = request()->only('title','price','content');
$userData = ([
'title' => $data['title'],
'price' => $data['price'],
'content' => $data['content'],
]);
$data = \App\Ad::find($id);
$data->update($userData);
return response()->json($data);
}
我不是 laravel 开发者。我只是偶然发现了文档。你还应该将 csrf 字段添加到你的 blade
在edit.blade.php
中,在开始<form>
标签后添加这个
{{csrf_field()}}
还有你update方法中的参数排列不合理
应该是
public function update(Request $request, $id) {
}
第二个参数($id
)来自您在 web.php
文件
Route::post('/user/update/{id}', ['as' => 'users.update', 'uses' =>'UserAdController@update']);
其中 {id}
将替换为原来的 id
谢谢大家!!
看来我做的不对。
我需要在编辑表单中添加 {{csrf_field()}}
并使用 $request->only()
我认为如果你使用这样的 put 方法会更好:
Route::put('ad/{ad}', ['as' => 'users.update', 'uses' =>'UserAdController@update']);
将您的表单更新为如下所示:
<div class="container">
<br>
<h3>Edit your ad</h3>
<br>
<form method="post" action="{{route('users.update', ['ad' => $ad->id])}}">
<input name="_method" type="hidden" value="PATCH">
{{ method_field('put') }}
{{ csrf_field() }}
<div class="form-group">
<label for="title">Title</label>
<input type="text" name="title" class="form-control" id="title" value="{{$ad->title}}">
</div>
<div class="form-group">
<label for="title">Price</label>
<input type="text" name="price" class="form-control" id="title" value="{{$ad->price}}">
</div>
<div class="form-group">
<label for="content">Your content</label>
<textarea name="content" class="form-control" id="content" rows="3">{{$ad->content}}</textarea>
</div>
<div class="form-group">
<input type="submit" value="Update" class="btn btn-info">
</div>
</form>
现在是您的更新功能:
public function update(\App\Ad $ad, Request $request){
$request->validate([
'title'=>'required',
'price'=> 'required|integer',
'content' => 'required'
]);
//$data = \App\Ad::find($id);
$ad->update([
"title" => $request->title,
"price" => $request->price,
"content" => $request->content,
]);
return redirect()->back()->with('success', 'Data updated');
}
当您习惯放置、删除和修补方法时,您可以阅读 Route::resource 并且您的代码会更容易。