Persist no VRaptor com Ajax do JQuery

Pessoal,

 Tenho o seguinte envio via post no meu formulário jsp com ajax do JQuery:

[code]

$.ajax({
              type: 'POST',
              url: contextoDaAplicacao + '/grupoDeAvaliacao/persistirTurma',
              data: 'turma.grupoDeAvaliacao.id='+escape(valoresTurma[0])+
                    '&turma.idCurso='+escape(valoresTurma[1])+
                    '&turma.ano='+escape(valoresTurma[2])+
                    '&turma.serie='+escape(valoresTurma[3])+
                    '&turma.semestre='+escape(valoresTurma[4])+
                    '&turma.turno='+escape(valoresTurma[5])+
                    '&turma.turma='+escape(valoresTurma[6]),
              cache: false,
              
              success: function( data ) {
                alert(data);
              }

            });
[/code]

E tenho o seguninte código no meu método "persistirTurma()" do controller de recepção:

[code]

 public String persistirTurma(Turma turma) throws Exception {

   

    try {

        daoFactory.getTurmaDao().persistir(turma);        
        return "ok";

    } catch (EntidadeExistenteException erro) {
        
        return "erro";
    }

    

}

[/code]

O problema é que o "sucess" da minha chamada ajax não funciona. Ele consegue persistir a turma no banco de dados mas a mensagem de alerta do "success" do ajax não é exibida. Alguém sabe me dizer o que pode ser isso? Conto com o apoio de vocês.

Olá!
Tente assim:

    $.ajax({
                  type: 'POST',
                  url: contextoDaAplicacao + '/grupoDeAvaliacao/persistirTurma',
                  data: 'turma.grupoDeAvaliacao.id='+escape(valoresTurma[0])+
                        '&turma.idCurso='+escape(valoresTurma[1])+
                        '&turma.ano='+escape(valoresTurma[2])+
                        '&turma.serie='+escape(valoresTurma[3])+
                        '&turma.semestre='+escape(valoresTurma[4])+
                        '&turma.turno='+escape(valoresTurma[5])+
                        '&turma.turma='+escape(valoresTurma[6]),
                       cache: false;
                  
                   function() {            
                   alert('sucesso!');
             });

                });
    

Teste essa function dentro do código, ai é substituir pelo que estiver vindo do Controller.
[]s

Cara,

 Esse código que você postou não funciona. O ";" no final da linha 11 e a linha 15 também dá erro.

Dica:
isso:

    $.ajax({
                  type: 'POST',
                  url: contextoDaAplicacao + '/grupoDeAvaliacao/persistirTurma',
                  data: 'turma.grupoDeAvaliacao.id='+escape(valoresTurma[0])+
                        '&turma.idCurso='+escape(valoresTurma[1])+
                        '&turma.ano='+escape(valoresTurma[2])+
                        '&turma.serie='+escape(valoresTurma[3])+
                        '&turma.semestre='+escape(valoresTurma[4])+
                        '&turma.turno='+escape(valoresTurma[5])+
                        '&turma.turma='+escape(valoresTurma[6]),
                  cache: false,
                  
                  success: function( data ) {
                    alert(data);
                  }

                });

é a mesma coisa que:

$.ajax({
  type: 'POST',
  url: contextoDaAplicacao + '/grupoDeAvaliacao/persistirTurma',
  data: {
    'turma.grupoDeAvaliacao.id' : valoresTurma[0],
    'turma.idCurso' : valoresTurma[1],
    'turma.ano': valoresTurma[2],
    'turma.serie': valoresTurma[3],
    'turma.semestre': valoresTurma[4],
    'turma.turno': valoresTurma[5],
    'turma.turma': valoresTurma[6]
  }
  cache: false,
  success: function( data ) {
      alert(data);
   }
});

de qqer forma, no log da aplicação está aparecendo algum erro?

Achei uma coisa aqui cara. Quando o mudo o ‘sucess’ para ‘complete’ assim:

function vincularTurmaAoGrupoDeAvaliacao(turma){

                valoresTurma = turma.value.split('-');

                $.ajax({
                  type: 'POST',
                  url: contextoDaAplicacao + '/grupoDeAvaliacao/persistirTurma',
                  data: 'turma.grupoDeAvaliacao.id='+escape(valoresTurma[0])+
                        '&turma.idCurso='+escape(valoresTurma[1])+
                        '&turma.ano='+escape(valoresTurma[2])+
                        '&turma.serie='+escape(valoresTurma[3])+
                        '&turma.semestre='+escape(valoresTurma[4])+
                        '&turma.turno='+escape(valoresTurma[5])+
                        '&turma.turma='+escape(valoresTurma[6]),
                  cache: false,
                  
                  complete: function( data ) {
                    alert(data.responseText);
                  }

                });


            }

Ele me mostra uma mensagem mostrando status 404 quanto tenta procurar persistirTurma.jps. Ou seja, ao terminar a execução do método no controller o vraptor está redirecionando para a página referente á action do controller, o que não deveria acontecer, pois como é ajax deveria voltar para a mesma página. Alguém sabe como configurar isso?

Ops, é isso mesmo, no lugar do “;” é “,” . Essas funções ajax são bem chatinhas de fazer, o que está no manual às vezes não funciona, tipo, vc está começando a função com $ajax, aqui só funcionou colocando $.post, e depois do código mandando os dados pro Controller tenho aquela function() pra mostrar o alerta.
[]s

Então, pelo visto é outra coisa cara. Acho que é problema de redirecionamento do VRaptor mesmo, ao terminar a execução do método ele tenta redirecionar para uma página que não existe e dá erro. Por isso o success não funciona. Agora resta saber como faço para redirecionar para a página que chamou o método.

Por enquanto você precisa fazer isso manualmente chamando o Result.forwardTo ou afins quando der um erro. Algo como:

try { classe.fazAlgumaCoisa(); result.forwardTo(this).outroMetodo(); } catch (Exception e) { result.forwardTo(this).deuAlgumErro(); }

Cara,

 Tenho que fazer dessa forma porque o VRaptor ainda não dá suporte á isso?

se vc quer que o retorno da requisição seja “ok” ou “error”, vc tem que fazer:

public void persistirTurma(Turma turma) throws Exception {
    try {
        daoFactory.getTurmaDao().persistir(turma);        
        result.use(Results.http()).body("ok");
    } catch (EntidadeExistenteException erro) {
        result.use(Results.http()).body("erro");
    }
}

Cara,

 Eu estou usando o VRaptor 3.1.2 e nesta classe "br.com.caelum.vraptor.view.Results" não tem esse método body. Dá erro no código.

atualize pro VRaptor 3.1.3 (precisa atualizar o paranamer pra 2.2 também)

ou então use outra estratégia: ao invés de retornar “ok” faça result.nothing(), e ao invés de retornar “erro” faça

result.use(Results.status()).badRequest();

daí no ajax vc pode colocar success e error ao invés de fazer um if

Então cara,

 Com o result.nothing() não funcionou. Então fiz assim e resolveu:
 public void persistirTurma(Turma turma) throws Exception {

        try {

            daoFactory.getTurmaDao().persistir(turma);
            result.use(Results.status()).ok();

        } catch (EntidadeExistenteException erro) {

            result.use(Results.status()).conflict();
        }

        

    }

Acho que é isso né?

isso =)