Solucionado (ver solução)
Solucionado
(ver solução)
5
respostas

Desafio Update

Ola, tudo bem? Não estou conseguindo fazer a atualização dos dados com o método altera. O método para buscar os dados e popular no formulário de edição esta ok! o problema ta só para atualizar os dados com método alterado.

Erro: NotFoundHttpException in RouteCollection.php line 145:

ProdutosController:

//codigo acima omitido

public function busca($id){
        $resposta = produto::find($id);

        if(empty($resposta)) {
            return "Esse produto não existe";
          }
          return view('produto/formularioAltera')->with('p', $resposta);

    }

    public function alterado(ProdutoRequest $request, $id){
           $id = Request::route('id');

        $produto = Produto::find($id);

        $produto->update($parametros);

        return redirect('/produtos')->withInput();
      }

Routes:

<?php
Route::get('/',function(){return '<h1>Primeira logica com Laravel</h1>';});

Route::get('/outra', function()
{
  return '<h1>Outra lógica com Laravel</h1>';
});

Route::get('/produtos', 'ProdutoController@lista');

Route::get('/produtos/mostra/{id}', 'ProdutoController@mostra');

Route::get('/produtos/novo', 'ProdutoController@novo');

Route::post('/produtos/adiciona', 'ProdutoController@adiciona');

Route::get('/produtos/json', 'ProdutoController@listaJson');

Route::get('/produtos/remove/{id}', 'ProdutoController@remove');

Route::get('/produtos/busca/{id}', 'ProdutoController@busca');

Route::post('/produtos/altera/{id}', 'ProdutoController@altera');

formularioAltera:

@extends('layout.principal')

@section('conteudo')
<h1 class="center">Atualizar produto: {{$p->id}}</h1>
<form action="/produtos/alterado/{{$p->id}}" method="post">

    <input type="hidden" name="_token" value="{{csrf_token()}}">

    <div class="form-group">
       <label>Nome</label>
       <input id="nome" name="nome" class="form-control" value="{{ $p->nome }}" >
    </div>

    <div class="form-group">
       <label>Valor</label>
        <input id="valor" name="valor" class="form-control" value="{{$p->valor}}">
    </div>

    <div class="form-group">
       <label>Quantidade</label>
        <input id="quantidade" name="quantidade" class="form-control" type="number" value="{{$p->quantidade}}">
    </div>

  <div class="form-group">
    <label>Descrição</label>
    <input id="descricao" name="descricao" class="form-control" value="{{ $p->descricao }}" >
  </div>
    <button type="submit" class="btn btn-primary">Atualizar</button>

</form>
@stop
5 respostas
solução!

Oi Danillo!

Vc precisa primeiro alterar no seu routes de altera para alterado:

Route::post('/produtos/altera/{id}', 'ProdutoController@altera');
Route::post('/produtos/altera/{id}', 'ProdutoController@alterado');

depois disso, o primeiro passo de buscar o produto no banco tá ok.

mas agora precisa atribuir os parametros vindos da requisição pra esse produto, e em seguida chamar o save(). algo do tipo:

$produto = Produto::find($id);

$produto->nome = $request->nome;

$produto->save();

Como parâmetros, receba um Request, e não um ProdutoRequest:

public function alterado($id, Request $request)

Para atualizar todos os valores de uma vez, sem ter que atribuir um a um, vc pode fazer algo como:

$valores = $request->all();

$produto->fill($valores)->save();

Lucas Félix, muito obrigado meu caro amigo! fiz dessa forma e deu tudo certo

public function alterado($id){

        $produto = Produto::find($id);
        $produto->nome = Request::input('nome');
        $produto->valor = Request::input('valor');
        $produto->descricao = Request::input('descricao');
        $produto->quantidade = Request::input('quantidade');

        $produto->save();

        return redirect()->action('ProdutoController@lista');


    }

que bom que funcionou!

abraço e bons estudos!

Testei também a opção sugerida por você com o método fill() para não deixar tudo estático e funcionou também!

Dessa forma:

public function alterado($id){

           $produto = Produto::find($id);
        $valores =Request::all();

        $produto->fill($valores)->save();

        return redirect()->action('ProdutoController@lista');


    }