Foros del Web » Programando para Internet » PHP »

LARAVEL - Imposible usar ruta destroy al generarla con Route::resource

Estas en el tema de LARAVEL - Imposible usar ruta destroy al generarla con Route::resource en el foro de PHP en Foros del Web. Hola a todos CONTEXTO . Estoy trabajando en Laravel 8 y uso el plugin DataTables para mostrar en pantalla los registros de una base de ...
  #1 (permalink)  
Antiguo 05/11/2020, 16:42
Avatar de 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!
  #2 (permalink)  
Antiguo 05/11/2020, 16:52
Avatar de 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!

Etiquetas: Ninguno
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 20:44.