Ver Mensaje Individual
  #2 (permalink)  
Antiguo 05/11/2020, 16:52
Avatar de berkeleyPunk
berkeleyPunk
 
Fecha de Ingreso: febrero-2013
Ubicación: México :C
Mensajes: 565
Antigüedad: 11 años, 2 meses
Puntos: 22
Respuesta: LARAVEL - Imposible usar ruta destroy al generarla con Route::resource

[QUOTE=berkeleyPunk;4837065]Hola a todos

CONTEXTO. Estoy trabajando en Laravel 8 y uso el plugin DataTables para mostrar en pantalla los registros de una base de datos. Como verán en el código, creo todas las rutas para hacer CRUD usando:
Código PHP:
Route::resource('animal''AnimalController'); 
. Esto genera una ruta para el método DELETE así: animal/{id}

PROBLEMA. Cuando presiono el botón borrar de un registro en específico, el registro sí se borra, bien, pero la consola del navegador devuelve este error: "The DELETE method is not supported for this route. Supported methods: GET, HEAD, POST", y por tanto Javascript se rompe y nunca salta el alert de que el registro fue borrado. Y si cambio el tipo de petición a POST, ¡el error me dice que no es soportado POST y sí DELETE!

PREGUNTA: ¿qué estoy haciendo mal?

RUTA
Código PHP:
Route::resource('animal''AnimalController'); 
CONTROLADOR
Código PHP:
public function destroy($id)
{
    
$animal DB::select('CALL sp_destroy_animal(?)', [$id]);
    return 
back();

VISTA
Código PHP:
jQuery('#BTNeliminar').click(function(e){
    
e.preventDefault();
    var 
url '{{ route("animal.destroy", ":xxx") }}';
    
url url.replace(':xxx'animalID);
    
jQuery.ajax({
        
"url"url,
        
"type"'DELETE',
        
"data": {
            
"_token""{{ csrf_token() }}"
        
},
        
beforeSend: function() {
            
jQuery('#BTNeliminar').text('Eliminando...');
        },
        
success: function(data) {
            
setTimeout(function() {
                
// Desaparecemos el modal
                
jQuery('#modalEliminar').modal('hide');
                
// Que salte el toast como en Android
                
toastr.warning('El registro '+animalID+' fue eliminado correctamente.''Eliminar registro', {timeOut:3000});
                
jQuery('#tablaAnimal').DataTable().ajax.reload();
            }, 
100);
        }
    });
}); 
Ahora bien, todo funciona perfecto si creo una ruta en específico para borrar registros, por ejemplo
Código PHP:
Route::get('animal/eliminar/{id}', [AnimalController::class, 'destroy'])->name('animal.destroy'); 
, y esto arreglaría el problema. Pero no quiero crear una ruta extra. Yo quiero usar las rutas generadas al hacer uso de resource:
Código PHP:
Route::resource('animal''AnimalController'); 
¡Cualquier ayuda es bienvenida!