Como usar um g:link para a action update no form?
12/11/2014 11:38
0
Prezados amigos,

Gostaria de utilizar uma barra de ações dentro form de edit.gsp.

Estas ações seriam: Novo | Alterar | Listar



Então, resolvi retirar o botão g:actionsubmit e acrescentar uma barra de ações com o seguinte código:


<div class="well well-sm">
<row>
<a href="#">
<i class="ace-icon fa fa-plus-circle purple light-blue bigger-150"></i>
Novo
</a>

<a href="#">
|
</a>

<g:link action="update">
<i class="ace-icon glyphicon glyphicon-share green"></i>
Alterar
</g:link>

<a href="#">
|
</a>

<g:link action="index">
<i class="ace-icon glyphicon glyphicon-list green"></i>
Listar
</g:link>
</row>
</div>



Porém, ao clicar em "Alterar", recebo o seguinte erro:



HTTP Status 405 -


type Status report

message

description The specified HTTP method is not allowed for the requested resource.


Apache Tomcat/7.0.53


Tags: g:link;form;edit;controller;update


1
Existe alguma limitação de requisição na sua action? Por exemplo, ela aceita apenas GET. Pois é isso o retorno da mensagem.

Se precisar coloca a sua controller.

Agora, o título do seu post em nada converge com a sua pergunta.


0
Olá Carlos Eduardo,

Obrigado pela resposta. Realmente o título ficou péssimo - estava sem inspiração.

Há como eu reeditar o tópico?

Então, o que eu quero é utilizar o "Alterar" para fazer exatamente o que um actionsubmit faria: passar o form para o controller e realizar o update do registro.

Segue o meu controller:



package geo



import static org.springframework.http.HttpStatus.*
import grails.transaction.Transactional

@Transactional(readOnly = true)
class CidadeController {

static allowedMethods = [save: "POST", update: "PUT", delete: "DELETE"]

def index(Integer max) {
session.menu000 = "[Menu000]"
session.menu001 = "[Menu001]"
session.menu002 = "Cidade"
params.max = Math.min(params.max ? params.int('max') : 10, 100)
[cidadeInstanceList: Cidade.list(max:params.int('max'),offset: 0), cidadeInstanceTotal:Cidade.count()]
}

def list = {
params.max = Math.min(params.max ? params.int('max') : 10, 100)
[cidadeInstanceList: Cidade.list(max:params.int('max'),offset: 0), cidadeInstanceTotal:Cidade.count()]
}

def lister = {
params.max = Math.min(params.max ? params.int('max') : 10, 100)
render(template: 'list', model: [cidadeInstanceList: Cidade.list(params), cidadeInstanceTotal:Cidade.count()])
}


def show(Cidade cidadeInstance) {
respond cidadeInstance
}

def create() {
respond new Cidade(params)
}

@Transactional
def save(Cidade cidadeInstance) {
if (cidadeInstance == null) {
notFound()
return
}

if (cidadeInstance.hasErrors()) {
respond cidadeInstance.errors, view:'create'
return
}

cidadeInstance.save flush:true

request.withFormat {
form multipartForm {
flash.message = message(code: 'default.created.message', args: [message(code: 'cidade.label', default: 'Cidade'), cidadeInstance.id])
redirect cidadeInstance
}
'*' { respond cidadeInstance, [status: CREATED] }
}
}

def edit(Cidade cidadeInstance) {
respond cidadeInstance
}

@Transactional
def update(Cidade cidadeInstance) {
if (cidadeInstance == null) {
notFound()
return
}

if (cidadeInstance.hasErrors()) {
respond cidadeInstance.errors, view:'edit'
return
}

cidadeInstance.save flush:true

request.withFormat {
form multipartForm {
flash.message = message(code: 'default.updated.message', args: [message(code: 'Cidade.label', default: 'Cidade'), cidadeInstance.id])
redirect cidadeInstance
}
'*'{ respond cidadeInstance, [status: OK] }
}
}

@Transactional
def delete(Cidade cidadeInstance) {

if (cidadeInstance == null) {
notFound()
return
}

cidadeInstance.delete flush:true

request.withFormat {
form multipartForm {
flash.message = message(code: 'default.deleted.message', args: [message(code: 'Cidade.label', default: 'Cidade'), cidadeInstance.id])
redirect action:"index", method:"GET"
}
'*'{ render status: NO_CONTENT }
}
}

protected void notFound() {
request.withFormat {
form multipartForm {
flash.message = message(code: 'default.not.found.message', args: [message(code: 'cidade.label', default: 'Cidade'), params.id])
redirect action: "index", method: "GET"
}
'*'{ render status: NOT_FOUND }
}
}
}





Obrigado!
12/11/2014 17:42


0
O seu save está aceitando apenas requisições via POST, isto está explicito no allowedMethods.

O que pode fazer seria usar o remoteFunction() do grails para chamar o evento de salvar.

* Usa o firebug e dá uma confirmada se o evento disparado é via POST ou GET.



Ainda não faz parte da comunidade???

Para se registrar, clique aqui.


Aprenda Groovy e Grails com a Formação itexto!

Newsletter Semana Groovy

Assinar

Envie seu link!


Livro de Grails


/dev/All

Os melhores blogs de TI (e em português) em um único lugar!

 
Creative Commons
RSS Grails Brasil é mantido por itexto Consultoria.
Em caso de problemas contacte Henrique Lobo Weissmann (Kico) por e-mail: kico@itexto.com.br
Todo o conteúdo presente neste site adota o Creative Commons como licença padrão.
Ver: 4.14.0
itexto