Restfulie
Essa semana eu resolvi dar uma olhada no plugin Restfulie da Caelum. Depois de ter tentado seguir o tutorial deles do github e não ter dado certo (já que algumas informações estavam faltando), resolvi ler o código do plugin e notei que é muito mais simples do que eu imaginava.
A função do plugin e o porque ele é legal, você pode ler no github mesmo. Aqui só vou mostrar o que eu fiz para realmente entender como a coisa funciona. =]
Acho que a parte mais difícil de um tutorial é criar um exemplo que não seja totalmente imbecil. Não consegui... então vai esse mesmo.
O que eu vou fazer é criar um resource bem “simplão” que simula a instalação de alguma coisa em algum lugar. Tudo o que o meu resource tem é um nome, um servidor e um status. Status. Palavrinha importantíssima que tem que ter, afinal é ela que armazena o estado em que se encontra o seu resource.
Ah, um PS aqui. Vou fazer só o server side. Client side fica pra outra hora.
No caso aqui, o que acontece é o seguinte: Fulaninho vai lá, cria um resource que fica pendente a espera da boa vontade de alguém de instalá-lo. Enquanto pendente, este resource pode também ser cancelado antes da instalação.
Uma vez instalado, este resource pode ser somente suspenso e depois de suspenso ele pode ser ou reativado ou deletado.
Abaixo uma representação dos estados e das transições:

Estados:
I. Pendente
II. Cancelado
III. Ativo
IV.Suspenso
V. Deletado
Transições:
1.Cancelar
2.Instalar
3.Suspender
4.Reativar
5.Deletar
Bom, então vamos lá.
Primeiro, criar o projeto e o recurso:
Depois instalar o plugin:
Se você criar um resource agora e olhar o xml, vai aparecer daquele jeito feio ainda.
Para que o plugin realmente faça o que se propõe é necessário explicitar no controlador a função “to_xml” no método show. O que o plugin faz é sobrescrever este método.
No meu caso, o resources_controller.rb ficou assim:
Mas a mágica do plugin fica no model resource.rb onde deve ser definido o método following_transitions:
Nesse método serão definidas as transições para cada estado:
Isso quer dizer que se estiver pendente, o recurso poderá ser cancelado ou instalado, se estiver suspenso, poderá reativado, e por ai vai.
Essas funções “is_pending?”, etc eu criei como forma de controlar as transições. Uma delas ficou assim:
Bem simples.
Final:




