Vraptor - Informações Multiplas em um Path do Controller

8 respostas
rmarlley

Bom dia amigos, sou novo no Vraptor e estou com alguns problemas.

Eu tenho uma tela que possui a seguinte disposição

pois bem, na parte de pessoas do perfil eu tenho um button nesse formato

tenho um codigo js que pega o id da pessoa e mandar pro controler

$(function(){ $("input:button[name='retirar']").click(function(){ var id = $(this).attr("id"); $.getJSON('<c:url value="/colaborador/retirarPerfil/"/>' + id, function(json){ $("#nome").val(json.colaborador.nome); }); }); });

coisa simples, pois bem. o meu problema é, eu preciso retirar isso de uma tabela que eh de cruzamento

TABELAS>>

PESSOA
PERFIL
PESSOA__PERFIL << CRUZAMENTO

onde tenho apenas o IdPessoa e o IdPerfil

No meu bean eu crier uma List que possui o conjunto, porem não to sabendo como mandar isso pro controller por que se tratam de beans diferentes e na pagina eu soh tenho as informações da pessoa e do perfil e não da tabela de cruzamento.

Ai pensei (não sei se está certo :shock: ) passo o id da pessoa e do perfil para o controller da pessoa e la é me viro, faco um session.createSQLQuery() e dou um DELETE la, enfim… porém não sei se esse eh o melhor caminho e não sei se passar multiplas informações pro Path funciona, ex: @Path(“colaborador/retirarPerfil/{id}/{idPerfil}”)

Se alguem puder me ajudar… :lol:

8 Respostas

Rafael_Guerreiro

Pelo o que eu entendi, você quer remover todos os perfis de somente uma pessoa?

Se for isso, é só você manda o ID da pessoa pro controller, como você está fazendo, ai você manda esse ID para o DAO, lá você limpa a lista dessa pessoa.

Se não for isso, se você quiser remover somente um perfil de uma determinada pessoa, pode fazer dessa forma mesmo.

Sim, é possível passar 2 parâmetros na URL.

Eu acho mais legal passar nos parâmetros mesmo (fica mais organizado, cada coisa no seu devido lugar…):

$.getJSON('&lt;c:url value="/colaborador/retirarPerfil/"/&gt;', {
      IdPessoa : id, 
      IdPerfil : variavelQueTemIdDoPerfil
}, 
function(json){  
      $("#nome").val(json.colaborador.nome);  
});
rmarlley

Show, vou testar e daqui a pouco digo o resultado.

rmarlley

Show, vou testar e daqui a pouco digo o resultado.

Lucas_Cavalcanti

lembrando que o nome dos parâmetros tem que ser os mesmos recebidos no controller…

do jeito que o Rafael falou vc deveria tirar os ids da url

rmarlley

Obrigados Meus amigos,funcionou perfeito, vejam o jquery e o controller.

jquery
$(function(){
                $("input:button[name='retirar']").click(function(){
                    var flag = confirm("Deseja EXCLUIR esse Colaborador desse perfil?");
                    if(flag){
                        var id = $(this).attr("id");
                        $.ajax({
                            type: "GET",
                            url: "<c:url value="/colaborador/retirarPerfil"/>",
                            data: {id:id, idPerfil:$("#idPerfil").val()},
                            dataType: "json",
                            success: function(data){
                                
                            }
                        });
                    }
                });
            });
e o controller
@Get
    @Path("colaborador/retirarPerfil")
    public void retirarPerfil(Integer id, Integer idPerfil){
        Colaborador colaborador = this.colaboradorDao.obterPorId(id);
        Boolean retorno = this.colaboradorDao.retirarPerfil(colaborador, idPerfil);
        result.use(json()).from(colaborador).serialize();
    }

agora tenho uma ultima duvida... gostaria de devolver 2 elementos pra pagina. o objeto colaborador e o retorno (boolean). Qual melhor forma de fazer?

Rafael_Guerreiro

Existem duas formas de fazer isso:

A primeira é, quando o retorno for false, ou seja, não conseguiu retirar o perfil, você volta um erro:

result.use(Results.status()).badRequest("Cannot remove this profile.");

Assim, toda vez que entrar no success é por que deu certo, quando entrar no error, é por que deu errado.
Infelizmente eu não sei como que eu faço para capturar essa mensagem na cláusula error (nunca tentei, na verdade). Caso não dê, coloque uma mensagem genérica.

A segunda, basta você criar uma jsp chamada retirarPerfil.json.jsp.

Ai você troca a linha: result.use(json()).from(colaborador).serialize();

Por um: result.include(colaborador, colaborador); result.include(retirou, retorno);

Dai, no seu jsp, você vai “criar” o JSON:

{
   'retirou':${retirou},
   'colaborador':{
      'id':${colaborador.id},
      'name':${colaborador.name},
   }
}

Uma dica: Se sua versão do VRaptor for maior que a 3.1, você pode fazer isso aqui:

@Get("/seu/path/aqui/")
Lucas_Cavalcanti

ou ainda vc pode criar uma classezinha só pra serializar:

class Resultado {
    Colaborador colaborador;
    boolean resultado;
}

....

result.use(json()).withoutRoot().from(new Resultado(colaborador, true)).include("colaborador").serialize();
rmarlley

Parceiro, por enquanto incluir essa linha no meu sucess e fim, resolveu meu problema por enquanto, mas vou investir na sua primeira solução assim que rolar, posto aqui.

segue a linha do sucess do ajax.

Criado 4 de outubro de 2012
Ultima resposta 5 de out. de 2012
Respostas 8
Participantes 3