Help Update Laravel

0

Good evening, I'm starting to study Laravel and I came across a problem that already took me a few hours to find a solution. I need to do an update on a form, and when I submit submit I get the error: Herearemycodes:Route:

Route::get('/produtos/edita/{id}','ProdutoController@edita')->where('id','[0-9]+');Route::post('/produtos/atualiza','ProdutoController@atualiza');

Blade:

@extends('layout.principal')@section('conteudo')<h1>EditarProduto:{{$p->nome}}</h1><formaction="/produtos/atualiza" method="post">
<input type="hidden" name="id" value="{{$p->id}}">
<input type="hidden" name="_token" value="{{{ csrf_token() }}}" />
<div class="form-group">
    <label>Nome</label>
    <input name="nome" class="form-control" value="{{$p->nome}}">
</div>
<div class="form-group">
    <label>Descrição</label>
    <input name="descricao" class="form-control" value="{{$p->descricao}}">
</div>
<div class="form-group">
    <label>Valor</label>
    <input name="valor" class="form-control" value="{{$p->valor}}">
</div>
<div class="form-group">
    <label>Quantidade</label>
    <input type="number" name="quantidade" class="form-control" value="{{$p->quantidade}}">
</div>
<button type="submit" class="btn btn-primary btn-block">Adicionar</button>
</form>
@stop

Controller:

 public function edita($id)
{
$produto = Produto::find($id);
return view('produto.editar')->with('p', $produto);
}

public function atualiza()
{
$params = Request::all(); 
$produto = Produto::find($params->id);
$produto->fill($params->except('id'));
$produto->save();
return redirect()->action('ProdutoController@lista');
}
    
asked by anonymous 06.11.2018 / 00:52

1 answer

3

You do not need to pass id to verb post , you only need to create input hidden and save the id value in this field, but if you still want the way you did in the tag form o id because the address will actually give 404 (because the address placed does not exist, it needs the code at the end, same is stipulated in its route ), change

<form action="/produtos/atualiza" method="post">

to

<form action="/produtos/atualiza/{$p->id}" method="post">

This change is by your route, but if I were you would do it correctly like this:

Route:

Route::get('/produtos/edita/{id}', 'ProdutoController@edita')->where('id', '[0-9]+');
Route::post('/produtos/atualiza', 'ProdutoController@atualiza');

Html:

@extends('layout.principal')
@section('conteudo')
    <h1>Editar Produto: {{$p->nome}}</h1>
    <form action="/produtos/atualiza" method="post">
    <input type="hidden" name="id" value="{{$p->id}}" />
    <input type="hidden" name="_token" value="{{{ csrf_token() }}}" />
    <div class="form-group">
        <label>Nome</label>
        <input name="nome" class="form-control" value="{{$p->nome}}">
    </div>
    <div class="form-group">
        <label>Descrição</label>
        <input name="descricao" class="form-control" value="{{$p->descricao}}">
    </div>
    <div class="form-group">
        <label>Valor</label>
        <input name="valor" class="form-control" value="{{$p->valor}}">
    </div>
    <div class="form-group">
        <label>Quantidade</label>
        <input type="number" name="quantidade" 
               class="form-control" value="{{$p->quantidade}}">
    </div>
    <button type="submit" class="btn btn-primary btn-block">Adicionar</button>
    </form>
@stop

Controller:

public function edita($id)
{
    $produto = Produto::find($id);
    return view('produto.editar')->with('p', $produto);
}

public function atualiza()
{
    $params = Request::all(); 
    $produto = Produto::find($params['id']);
    $produto->fill($params);
    $produto->save();
    return redirect()->action('ProdutoController@lista');
}

References:

06.11.2018 / 01:09