Ver Mensaje Individual
  #1 (permalink)  
Antiguo 05/11/2020, 16:42
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
Pregunta LARAVEL - Imposible usar ruta destroy al generarla con Route::resource

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.

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 pasando 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. Pero la idea es que use yo la ruta que viene por defecto al declarar mis rutas con resource:
Código PHP:
Route::resource('animal''AnimalController'); 
Esto sí funciona sin problema:

RUTA
Route::get('animal/eliminar/{id}', [AnimalController::class, 'destroy'])->name('animal.destroy');

VISTA
jQuery('#BTNeliminar').click(function(e){
e.preventDefault();
jQuery.ajax({
url: 'animal/eliminar/'+animalID,
"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);
}
});
});


¡Cualquier ayuda es bienvenida!