Я все перепробовал и не могу понять, в чем моя ошибка.
метод update () не обновляет ничего, я получаю только ошибку "Нет сообщения" ...
Вот маршруты в 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 () возвращает массив с одним элементом, а валидатор - это наиболее распространенный способ обработки входящего запроса.
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 к своему клинку
В edit.blade.php добавьте это после открывающего тега <form>.
{{csrf_field()}}
Кроме того, параметры в вашем методе обновления не очень хорошо организованы.
Должен быть
public function update(Request $request, $id) {
}
Второй параметр ($id) исходит из того, что вы определили как свои маршруты в файле web.php.
Route::post('/user/update/{id}', ['as' => 'users.update', 'uses' =>'UserAdController@update']);
Где {id} будет заменен оригинальным 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');
}
когда вы научитесь использовать методы put, delete и patch, вы сможете прочитать о Route :: resource, и ваш код станет проще.