Laravel 5.7: метод обновления возвращает «Нет сообщения» - PullRequest
0 голосов
/ 28 октября 2018

Я перепробовал все и не могу понять, где моя ошибка.

метод 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']);

view 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');

}

Ответы [ 5 ]

0 голосов
/ 28 октября 2018

Я думаю, было бы лучше, если бы вы использовали метод 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, и ваш код станет проще.

0 голосов
/ 28 октября 2018

Спасибо всем !!

Похоже, я не все сделал правильно.

Мне нужно было добавить {{csrf_field()}} в форме редактирования и использовать $request->only()

0 голосов
/ 28 октября 2018

Request-> only () возвращает массив с одним элементом, в то время как validator является наиболее распространенным способом обработки проверки для входящего запроса.

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); 

   }
0 голосов
/ 28 октября 2018

Я не разработчик 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

0 голосов
/ 28 октября 2018

Попробуйте вместо этого

public function update(Request $request){
   //your code here
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...