Plugins para rails e grails

Publiquei eles só no meu blog em ingles, mas acho que vale o link aqui pelo menos …

Para quem é tão preguiçoso quanto eu, eu criei um plugin para o rails que reutiliza tudo (ou quase) o que você ja definiu na migration para gerar o model, o nome do plugin é mydry.

E para quem trabalha com Grails, e estava triste até agora por não poder utilizar BDD de forma fácil, eu criei o plugin easyb-test que permite utilizar o easyb para escrever testes para a sua aplicação Grails.

Se quiserem um exemplo de como usar este plugin do easyb, é só olhar o material da minha palestra do FISL deste ano.

Se você gostou deste post, lembre-se de assinar o RSS feed do blog, para ser notificado de novos posts!

Vou palestrar no FISL este ano :D

fisl-logo.jpeg

Acabei de ver que saiu na terceira lista de palestras aprovadas do FISL a minha palestra: Grails - Agilidade, produtividade e código bonito ao alcance de todos!

Então nos vemos no FISL, espero que os que aparecerem por la assistam a minha palestra, vai estar bem legal :D
Não vai ser só aquele CRUD básico que é apresentado em todos os lugares, estou preparando um esquema bem legal para vocês :D

<updated>
Acabou de ser publicado na grade de horários, a palestra vai ser dia 19 de abril as 16h :D
Espero que pelo menos um ou dois de vocês apareçam por la para que eu não fique sozinho na sala :D
</updated>

Se você gostou deste post, lembre-se de assinar o RSS feed do blog, para ser notificado de novos posts!

Paginação AJAX com Grails e lowpro :D


Bom, apresentei hoje um tutorial sobre Grails[bb] (os slides são os mesmos utilizados para a apresentação na FACENSA no ano passado sobre Grails também), o Exemplo de código pronto eu vou colocar aqui durante a semana pois vou mudar o servidor do blog e ja copiei todos os arquivos para o server novo :D

Mas o último exemplo que eu quis fazer não funcionou, era um exemplo de como fazer Paginação via AJAX no grails utilizando Javascript não com o lowpro, parecido com o que eu comentei no post sobre lowpro para o rails.

Cheguei em casa e fui tentar descobrir por que a coisa não funcionou, e foi mais fácil do que eu esperava.
Não funcionou por que eu esqueci que os templates padrão do Grails não utilizam IDs nas DIVs, por tanto o AjaxUpdater criado não funcionava …

Para fazer o exemplo funcionar é só fazer o seguinte:
copiar o lowpro.js para a pasta web-app/js
editar o template padrão (grails-app/views/layouts/main.gsp) e fazer ele ficar parecido com o seguinte:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<html>
    <head>
        <title><g:layoutTitle default="Grails" /></title>
        <link rel="stylesheet" href="${createLinkTo(dir:'css',file:'main.css')}" />
        <link rel="shortcut icon" href="${createLinkTo(dir:'images',file:'favicon.ico')}" type="image/x-icon" />
        <g:layoutHead />
        <g:javascript library="prototype/prototype" />
        <g:javascript library="lowpro" />
        <g:javascript library="application" />
    </head>
    <body>
        <div id="spinner" class="spinner" style="display:none;">
            <img src="${createLinkTo(dir:'images',file:'spinner.gif')}" alt="Spinner" />
        </div>	
        <div class="logo"><img src="${createLinkTo(dir:'images',file:'grails_logo.jpg')}" alt="Grails" /></div>	
	<div id="content">
        <g:layoutBody />
	<div>
    </body>	
</html>

Basicamente as alterações são:
Nas linhas 7 e 8 onde adicionei as bibliotecas lowpro e prototype[bb]
e mais importante, nas linhas 16 e 18 onde coloquei uma DIV com ID “content” em volta do conteúdo da página (isto vocês podem ajustar para envolver apenas o conteúdo que vocês quiserem).

Depois editando o application.js (web-app/js/application.js)

1
2
3
4
Event.addBehavior.reassignAfterAjax = true;
Event.addBehavior({
  'a.step':Remote.Link({update:'content'})
})

Apenas adicionei estas linhas no final do arquivo, a primeira configura o lowpro para reaplicar os comportamentos no final das chamadas AJAX, e as outras adicionam o comportamento de link AJAX em todas as tags “A” com a classe “step” que é o que o grails utiliza na paginaçao.

Agora a parte chata, no rails ele ja entende isto automaticamente, mas no grails eu tive que fazer na unha mesmo (nem é tanto trabalho assim :D )
Vamos editar o metodo “list” do controller de clientes (ou qualquer controller do grails que vocês quiserem :D )

1
2
3
4
5
6
       if(!params.max) params.max = 10
	if(request.getHeader("X-Requested-With")=="XMLHttpRequest"){
		render template:'listcontent', model:[clienteList: Cliente.list( params )]
	}else{
	        return [ clienteList: Cliente.list( params ) ]
	}

A diferença básica é que se o cabeçalho X-Requested-With disser que é uma requisição AJAX eu vou retornar apenas a parte da página que me interessa (OK, isto eu teria que fazer no rails também, mas o rails iria me retornar toda a página se eu não fizesse isto, o grails não retorna nada ) :D
e para isto funcionar precisamos editar a view também …
eu copiei todo o conteúdo da tag body da view “list.gsp” para o arquivo “_listcontent.gsp” (precisei criar o arquivo), e na list.gsp eu coloquei no body apenas a linha: ${render(template:’listcontent’)}

Ou seja, substitui todo o conteúdo do body por esta linha, assim posso renderizar tudo em um request padrão, e apenas o conteúdo da página em um request AJAX.

Pronto, agora a paginação do Grails esta funcionando via AJAX :D

esta semana eu atualizo este post com o link para o zip do exemplo completo, mas apenas com isto vocês ja devem conseguir fazer a paginação via AJAX :D

PS.: não esqueçam para utilizar todos os recursos do Grails é interessante saber bem groovy[bb] (a linguagem utilizada), spring[bb], GORM (hibernate[bb]) e sitemesh que são os frameworks utilizados por traz dos panos.

Se você gostou deste post, lembre-se de assinar o RSS feed do blog, para ser notificado de novos posts!