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

Deletar primeiro registro em uma table na tela

Boa noite. Tenho uma table e para conseguir excluir um registro dela utilizando o método HTTP:DELETE fiz o seguinte:

Estou usando Laravel 5.6.

Meu controller:

public function destroy($id)
    {
        $classe = Classe::find($id);
        $classe->delete();
        return redirect()->action('ClasseController@index');
    }

Meu web.php

Route::delete('/classes/{id}', 'ClasseController@destroy');

Minha view.php

<form>
    <table>
...
     <td>
        <form method="post" action="/classes/{{$chars->id}}">
            {{method_field('DELETE')}}
            @csrf
            <button type="submit" class="btn btn-danger btn-sm">Delete</button>
    </form>
</td>
</table>
</form>

Meu problema é quando tento excluir o primeiro registro da minha table. Somente ele. Quando clico no botão de excluir da minha linha da table minha URI fica da seguinte forma:

http://localhost:8000/classes?_method=DELETE&_token=GErGZKTWOXo86eog2JgSS0Y3Jwe2WAjdgzbHm8Dj

em qualquer outro registro da table, ele exclui normal e faz o redirect para o index()

Alguma ideia? :)

5 respostas

Oi Deivison,

Olhando o código não vi nada de errado.

O problema parece ser na página html, pois parece que a requisição está sendo disparada como GET ao inves de POST.

Pode postar aqui o código completo dela?

Mas por qual motivo somente no 1 registro da table estaria sendo disparada como GET?

Porque se eu tentar excluir do registro 2 até ao 1000 por exemplo não tem nenhum problema!! Eu clico no botão de deletar da minha table e é excluido normalmente... mas se eu clico no registro da 1 linha, tendo somente 1 resultado ou 1000, ele não exclui e a URI fica da forma que eu passei no 1 post.

View:

@extends('layout.principal')

@section('conteudo')
<form>
    <table class="table table-bordered table-striped table-hover">
        <thead>
            <th scope="col">Nick</th>
            <th scope="col">Vida</th>
        </thead>
        @foreach($characters as $chars)
        <tbody>
            <td>{{$chars->nick_name}}</td>
            <td>{{$chars->health}}</td>
            <td>
                <form method="post" action="/characters/{{$chars->id}}">
                    {{method_field('DELETE')}}
                    @csrf
                    <button type="submit" class="btn btn-danger btn-sm">Delete</button>
                </form>
            </td>
        </tbody>
        @endforeach
    </table>
</form>
@stop

principal.blade.php

<html>
<head>
  <link href="{{asset('css/app.css')}}" rel="stylesheet">
  <script src="{{asset('js/app.js')}}"></script>
  <title>Testes</title>
</head>
<body>
  <div class="container">

    <nav class="navbar navbar-expand-lg navbar-dark bg-dark">
      <a class="navbar-brand" href="/">Home</a>
      <div class="collapse navbar-collapse" id="navbarSupportedContent">
        <ul class="navbar-nav mr-auto">
          <li class="nav-item dropdown">
            <a class="nav-link dropdown-toggle" href="#" id="navbarDropdown" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
              Classes
            </a>
            <div class="dropdown-menu" aria-labelledby="navbarDropdown">
              <a class="dropdown-item" href="{{action('CharacterController@index')}}">Listar Chars</a>
              <a class="dropdown-item" href="{{action('CharacterController@create')}}">Novo Char</a>

            </div>
          </li>
        </ul>
      </div>
    </nav>

    <div class="principal">
      @yield('conteudo')
    </div>


  </div>
</body>
</html>

Dê um var_dump antes do delete para checar se o registro está sendo recuperado corretamente.

var_dump($classe); exit;
$classe->delete();

Pode usar também o F12 para checar o que está sendo enviado na requisição. Só para se certificar se é um POST ou GET.

solução!

Oi Deivison,

Vi que no seu arquivo view tem dois forms aninhados.

Tem uma tag form dentro da td do botao de excluir, mas tem um outro form lá em cima, antes da tag table.

Talvez seja por isso que está acontecendo esse erro estranho.

Apague a tag form externa e deixe somente dentro da td e veja se resolve.

Outra coisa, vi também que na sua tabela você não está utilizando a tag tr, que representa uma linha na tabela, deixando as tags td soltas. E também dentro do seu @foreach está a tag tbody, mas ela deve ficar fora do @foreach, se não vai haver uma repetição dela.

Segue o código corrigido:

@extends('layout.principal')

@section('conteudo')
<table class="table table-bordered table-striped table-hover">
    <thead>
        <tr>
            <th scope="col">Nick</th>
            <th scope="col">Vida</th>
        </tr>
    </thead>
    <tbody>
        @foreach($characters as $chars)
            <tr>
                <td>{{$chars->nick_name}}</td>
                <td>{{$chars->health}}</td>
                <td>
                    <form method="post" action="/characters/{{$chars->id}}">
                        {{method_field('DELETE')}}
                        @csrf
                        <button type="submit" class="btn btn-danger btn-sm">Delete</button>
                    </form>
                </td>
            </tr>
        @endforeach
    </tbody>
</table>
@stop

@Gabriel, não conseguia nem fazer o var_dump pois ele não entrava no método de delete do controller.

@Rodrigo, era isso mesmo! Eu olhei algumas vezes o código e não tinha percebido esse primeiro form! Muito obrigado :)