Duvida sobre cadastro.
13/07/2014 15:54
0
Tenho um cadastro de cidade que no domain esta ligada pela classe de usuario, a minha duvida é: quando um usuario cadastrar uma cidade, essa cidade terá que ficar vinculada aquele usuario, e na listagem aparecer somente as cidades que aquele determinado usuario cadastrou, para cadastro e controle de usuario estou usando o plugin SpringSecurity. como que eu faço isso?

Obrigado!
Tags: cadastro, springsecurity


0
Oi Murilo,

é razoávelmente simples. Basta que você injete o serviço springSecurityService no seu controlador ou serviço que será o responsável por iniciar o processo de persistência tal como no exemplo a seguir:


class ControllerBruto {
def springSecurityService // pronto: tá injetado :)
}


No método em que for persistir, vai fazer algo assim:


def metodoQuePersisteCidade() {
cidade.usuario = springSecurityService.getCurrentUser()
// pra baixo tranquilo, normal
}


E pra buscar, basta usar o método springSecurityService.getCurrentUser() na hora de fazer as consultas.


0
Olá Murilo,
Complementando o post do Henrique, como a cidade pertence a um usuário você pode modelar a domain com um "static belongsTo = [usuario: Usuario]" (supondo que ela pertencerá a apenas um usuário).
Quando você for litar as cidades, basta fazer assim:
def cidades = Cidade.findAllByUsuario(springSecurityService.getCurrentUser())

Ai vc terá na variável "cidades" todas as cidades do usuário corrente. ^^

Caso este comportamente de visualização de dados separados por usuário (ou grupo de usuários) for se repetir várias vezes em seu sistema, uma boa opção é usar o MultiTenant.
14/07/2014 09:24


0
Obrigado pelas respostas, e desculpe a minha falta de conhecimento estou estudando o framework grails tem 3 semanas. =)

o que eu fiz foi o seguinte, criei o domain da cidade com o usuario, so que na view aparece a opção de escolher o usuario que eu quero vincular a cidade, o que eu preciso na verdade é que ele sempre grave o usuario que esteja logado sem mostrar o campo na tela.

depois eu tirei da tela o campo do usuario, e fiz o que o Henrique mostrou, so que fica aparencendo a mensagem de que o usuario esta vazio.
14/07/2014 22:33


0
Murilo, tem algum código para mostrar? Está executando o seu sistema com algum usuário logado?


0
Olá Murilo,
Então você quer que toda cidade criada seja associada ao usuário que a criou (usuário logado), certo?
No save() da sua "cidadeController" você pode colocar:
cidadeInstance = springSecurityService.getCurrentUser()

antes de chamar seu "cidadeInstance.validate()"
15/07/2014 10:32


0
desculpe, faltou um ".usuario" usar o código abaixo:
cidadeInstance.usuario = springSecurityService.getCurrentUser()
15/07/2014 10:33


0
Fiz os seguintes testes aqui:

Coloquei no domain da cidade o codigo


static belongsTo = [usuario: User]


depois para ter certeza que o springsecurity esta retornando um usuario eu fiz isso


print 'Usuario : ' + springSecurityService.getCurrentUser()


o retorno é o meu usuario que esta logado...

depois no controller da cidade no Save eu fiz assim:


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

cidadeInstance.usuario = springSecurityService.getCurrentUser()

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] }
}
}


e mesmo assim a mensagem:

O campo [usuario] da classe [class com.cadastro.Cidade] não pode ser vazia


estou usando a versão do grails 2.4.2..

muito obrigado pela ajuda até agora.

15/07/2014 23:17


0
Olá Murilo,

Coloque isso após a linha que você atribui o usuário:

cidadeInstance.validate()


O grails utiliza um atributo "errors" que toda domain class possui, quando vc altera uma domain dentro do save ou do update vc tem que chamar o validate para que esse atributo seja atualizado.

Esse método é executado sempre antes de chamar qualquer método de uma controller, ou seja, esse método foi chamado para o objeto que foi recebido por parâmetro no seu save, mas como vc alterou o objeto depois vc tem que executá-lo novamente, ai quando o "hasErrors" é executado ele vai retornar false e seu objeto vai ser salvo normalmente.
16/07/2014 08:43


1
Muito obrigado pela atenção e ajuda de vocês, consegui fazer o cadastro da cidade... =)

faltava fazer o que o Thiago recomendou.

=)
16/07/2014 21:25



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