Templates Scaffolding Controller.groovy - Como saber se uma propriedade existe
24/03/2014 00:30
0
Olá,

Sou iniciante no Grails e estou tentando criar uma condição dentro do template que gera o Scaffold dos controladores. Estou fazendo tudo de forma manual.

Eu quero testar se uma propriedade existe para alterar ou não a forma que é feito o list.

Hoje eu tenho dentro do controlador o seguinte código quando há um list:

def list(Integer max) {
params.max = Math.min(max ?: 10, 100)
[contaInstanceList: Conta.findAllByUser(session.user, params), contaInstanceTotal: Conta.count()]
}


Quando o domain não tem a propriedade user, eu faço o seguinte:

def list(Integer max) {
params.max = Math.min(max ?: 10, 100)
[contaInstanceList: Conta.lsit(params), contaInstanceTotal: Conta.count()]
}


Quero fazer isto de forma dinâmica para não ter que ficar alterando todas os meus controladores e ainda correr o risco de um dia esquecer.

Como posso fazer isto?
Tags: templates


0
Você pode fazer um find nas propriedades da classe:

<%
def userProperty = domainClass.properties.find{it.name == User}
if(userProperty){
%>
...
<%
}else{
%>
...
<%
}
%>
24/03/2014 13:41


0
Corrigindo e identando...


<%
def userProperty = domainClass.properties.find{it.name == "user"}
if(userProperty){
%>
...
<%
}else{
%>
...
<%
}
%>
24/03/2014 13:46


0
Oi Thiago, muito obrigado por responder.

Segui o exemplo que você passou, porém não funcionou.

O que estou fazendo é alterar o Controller.groovy com o seguinte código agora:

    def list(Integer max) {
params.max = Math.min(max ?: 10, 100)
def userProperty = ${className}.properties.find{it.name == "user"}
if (userProperty) {
[${propertyName}List: ${className}.findAllByUser(session.user, params), ${propertyName}Total: ${className}.count()]
} else {
[${propertyName}List: ${className}.list(params), ${propertyName}Total: ${className}.count()]
}
}


O Grails está apresentando erro quando tento acessar a página:

Error 500: Internal Server Error
URI /gfinanceiro/extrato/list
Class groovy.lang.MissingPropertyException
Message No such property: it for class: gfinanceiro.ExtratoController
25/03/2014 02:23


1
Olá Gustavo, os simbolos <% e %> são importantes.

O Controller.groovy é utilizado para gerar códigos, tudo que você escrever nele vai ser colocado na controller que você gerar, a não ser que você coloque dentro dessa tag (<%...%>).

Mas pela mensagem de erro parece que o find não vai funcionar assim, tente trocar ele por:

def userProperty = ${className}.properties.find{p -> p.name == "user"}
25/03/2014 16:53


0
Gustavo, coloque faça assim :


def list(Integer max) {
params.max = Math.min(max ?: 10, 100)
def dominio = new DefaultGrailsDomainClass( SeuDominioAqui.class )
def userProperty = dominio.properties.find{it.name == "user"}
if (userProperty) {
// Vejamos o que ele encontrou
println userProperty
}
}
25/03/2014 16:59


1
Olá Pedro Herrique e Gustavo,

Quando você está mexendo nos templates do scaffolding (Controller.groovy neste caso), você não precisa alterar o código sempre que executa um scaffolding para uma domain. Na sugestão do Pedro Herique a linha:

def dominio = new DefaultGrailsDomainClass( SeuDominioAqui.class )


traz o mesmo que já temos no scaffolding na variável "domainClass".
26/03/2014 17:25


0
Estou tentando de todos os jeitos e não funciona. Onde posso encontrar alguma documentação sobre o assunto. Procurei na API por properties, find, entre outros, mas acho que não estou sabendo procurar.

Não consegui usar o <%...%> isto apresenta erro.

então tentei usar da seguinte forma:

def list(Integer max) {
params.max = Math.min(max ?: 10, 100)
def userProperty = ${className}.properties.find {p-> p.name == "user" }
// def userProperty = ${className}.properties.find { it.name == "user" }
if (userProperty) {
[${propertyName}List: ${className}.findAllByUser(session.user, params), ${propertyName}Total: ${className}.count()]
} else {
[${propertyName}List: ${className}.list(params), ${propertyName}Total: ${className}.count()]
}
}


Mas o sistema apresenta o seguinte erro:

URI /gfinanceiro/extrato/list
Class groovy.lang.MissingPropertyException
Message No such property: name for class: java.util.LinkedHashMap$Entry Possible solutions: value
28/03/2014 02:58


1
Tenta colocar esse código no lugar da sua 'list' no controler do sacaffolding

def list(Integer max) {
params.max = Math.min(max ?: 10, 100)
<%
def userProperty = domainClass.properties.find{it.name == "user"}
if(userProperty){
%>
[${propertyName}List: ${className}.findAllByUser(session.user, params), ${propertyName}Total: ${className}.count()]
<%
}else{
%>
[${propertyName}List: ${className}.list(params), ${propertyName}Total: ${className}.count()]
<%
}
%>
28/03/2014 15:10


0
Perfeito Thiago Amarante. Funcionou corretamente.

Muito obrigado a todos pela ajuda.
28/03/2014 23:19



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