Validación de form laravel 5.4 con ajax

publicado por: Anonymous

Tengo un problema a la hora de mostrar los mensajes de error del formulario con ajax, por http tradicional va todo bien pero a la hora de hacerlo por ajax y fuerzo un error en el form me indica como respuesta 422 Unprocessable Entity pero no me muestra los mensajes de error como si fuera http normal.

Si el formulario está bien continua con el código del controlador, puse una respuesta más abajo para comprobar si la recibía bien por ajax y efectivamente me respondia el mensaje.

if ($request->ajax()) {
        return response()->json(['mensaje'=>'validacion pasada wey']);
    }

Reitero, por http normal funciona todo bien y me muestra los mensajes de validación correspondientes por ej: nombre no puede ser menor a 3 caracteres.

Revisé la documentación y cito esta parte:
En el caso de una petición HTTP tradicional, se generará una respuesta de redireccionamiento, mientras que se enviará una respuesta JSON para las solicitudes AJAX.

Dejo mi código ajax con el cual he estado probando las respuestas:

$('#btn_main').on('click',function(e){
        e.preventDefault();
        var action = $('#mainform').attr('action');
        var method = $('#mainform').attr('method');

        $.ajax({
        beforeSend:function(){
            console.log('before send ok');
        },
        url: action,
        type: method,
        data: $('#mainform').serialize(),
        dataType:'json',

        success:function(respuesta){
            $.each(respuesta,function(name,value){
                console.log('name: '+ name + 'n'+ 'value: '+ value);
            });
        },

        error:function(jqXHR,estado,error){
            console.log('estado error: ' + estado);
            console.log('error de error: ' + error);
        },

        complete:function(jqXHR,estado){
            console.log('estado complete: ' + estado);
        },
        timeout:10000
        });
    });

La forma que estoy validando en el controlador es la siguiente:

$this->validate($request,[
        'tracking' => 'min:3',
        'date' => 'min:6|required'
    ]); 

¿Debo agregar algo extra a la validación en el controlador para que me de la respuesta correspondiente en json?

Así estoy mostrando los errores pero supongo que si me diera una respuesta json los tendré que agregar con jquery.

@if(count($errors)>0)
    <ul class="alert alert-danger">
    @foreach($errors->all() as $error)
        <li>{{ $error }}</li>
    @endforeach
    </ul>
@endif

solución

El problema no era la generación de los mensajes de error ya que tal como lo decía la documentación los devolvía automáticamente.

El detalle es que los mensajes llegan por XHR en responseJSON y para mostrarlos la función error quedaría así:

error:function(jqXHR,estado,error){
      $.each(jqXHR.responseJSON,function(indice,valor){
            console.log(indice + ' - ' + valor);
      });
},
Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *