Edição com vraptor

5 respostas
A

Estou tentando fazer a parte de edição de uma entidade do meu sistema mas não estou conseguindo.
Meu formulário esta assim:

<form action="${linkTo[ProdutoController].edit(produto)}" 
	method="post" class="ls-form row">
	<fieldset>
		<label class="ls-label col-md-5">
			<b class="ls-label-text">Nome</b>
			<input id="nome" type="text" name="produto.nome" 
				value="${produto.nome}">
		</label>
		
		<label class="ls-label col-md-5">
			<b class="ls-label-text">Valor:</b>
			<input id="valor" type="text" name="produto.valor" 
				value="${produto.valor}">
		</label>
		
		<div class="ls-actions-btn">
		 	<button type="submit" class="ls-btn">Salvar</button>
		 	<a href="${linkTo[ProdutoController].index}" class="ls-btn-danger">Voltar</a>
		</div>
	</fieldset>
</form>

O meu método edit esta assim:

@Post
public void edit(@Valid Produto produto) {
	validator.onErrorRedirectTo(this).formEdit(produto);
	dao.update(produto);
	result.redirectTo(this).index();
}

O problema é quando chama o metodo edit, a variavel produto não esta vindo com o ID…
Como resolver isso?

Obrigado

5 Respostas

guivirtuoso

Experimente colocar um atributo hiden no html contendo o ID do produto.

<input type="hidden" name="produto.id" value="${produto.id}">

O VRaptor vai receber no seu post apenas os atributos preenchidos p/ injetar no objeto que ele está esperando.

Como não está sendo enviado o ID… o mesmo não estará presente no seu Objeto a hora que for recebido na Controller.

:wink:

A

Boa tarde,

Então pensei que tivesse outra alternativa, pois estava dando uma olhada no codigo do mamute
e eles não usam essa abordagem.

Codigo do formulario:

<form class="validated-form question-form hinted-form" action='${linkTo[NewsController].saveEdit(news)}' method="post" >
	<div class="news-guideline guideline">
		<h2 class="title section-title hint-title">${t['news.guideline.title']}</h2>
		${t['news.guideline.body']}
	</div>
	<label for="news-title">${t['news.title.label']}</label>
	<input id="news-title" type="text" class="required hintable text-input" 
		value="${news.title}" minlength="15" maxlength="150"
		name="title" placeholder="${t['news.title.placeholder']}" />
	
	<c:set var="descriptionPlaceholder" value="${t['news.description.placeholder']}"/>
	<tags:markDown value="${news.description}" hintId="news-description-hint"
		htmlClass="required description-input" minlength="30"/>
		
	<c:if test="${edit}">
		<label>${t['news.comment.label']}
			<input type="text" class="text-input required" minlength="5" 
				maxlength="150" name="comment" placeholder="${t['news.comment.placeholder']}" />
		</label>
	</c:if>

	<input class="post-submit big-submit" type="submit" value="${t['news.new_form.submit']}" />
</form>

Codigo do edit no controller:

@Post
@CustomBrutauthRules(EditNewsRule.class)
public void saveEdit(@Load News news, String title, MarkedText description, String comment) {
	Information newInformation = new NewsInformation(title, description, currentUser, comment);
	news.enqueueChange(newInformation, UpdateStatus.NO_NEED_TO_APPROVE);
	result.redirectTo(this).showNews(news, news.getSluggedTitle());
}

Em nenhum momento, pelo menos não achei, ele passam ou usam o input hidden.
E meu código esta parecido e não esta funcionando…

guivirtuoso

Sugiro que você vá avaliando a classe News, e verificando suas heranças p/ verificar o que é feito no método enqueueChange(…)

Provavelmente neste método e demais comportamentos deve estar a explicação de como acontece esse “update” no objeto sem que seja passado a referencia toda.

A sugestão que dei sobre colocar o campo hidden, é como é feito na forma mais pura ao se trabalhar com o VRaptor.

Obviamente se outros recursos mais avançados forem implementados, talvez realmente não seja necessário passar todos os dados, caso o backend seja capaz de determinar qual objeto está sendo manipulado.

Já que você está utilizando o código do Mamute como exemplo, avalie que você “clonou” todos os recursos necessários p/ essa persistência.

Olhei rapidamente o repositório, e o código é bem extenso, e certamente com bastante configuração… da uma olhada com carinho.

A

Obrigado pelo retorno.

Usei o código do mamute como exemplo, pois foi o único projeto com vraptor 4 atualizado e completo que achei. Caso tenha outro para indicar, lhe agradeço de mais :smile: :+1:

Apenas dou olhada no código para tentar entender e ver como resolveram algumas situações que me deparo, como essa por exemplo.

Mas vou seguir sua dica e dar uma estuda mais afundo no fluxo do CRUD de News.

guivirtuoso

Bom, é legal usar códigos “prontos” como apoio p/ ver como algumas coisas foram feitas…

Mas é sempre interessante saber como fazer “do zero” algumas rotinas… como o Update de um objeto utilizando o Vraptor.

Usa o guia de 10 minutos do site… e faz um crud simples… depois vai incrementando a parada.

Aqui no proprio forum deve ter varias threads com exemplos iniciais dos projetos… mesmo que sejam nas versoes anteriores… a parte de manipulacao dos objetos entre o backend e a view nao mudaram muito…

Boa sorte nos estudos.

Caso lhe ajude em algo… de uma olhada nisto:
https://github.com/guivirtuoso/vraptor4-angularjs-jwt

Abs.

Criado 20 de dezembro de 2015
Ultima resposta 22 de dez. de 2015
Respostas 5
Participantes 2