Usando o Observer no Rails
Este artigo seria apenas uma dica de como saber o que foi alterado em um objeto, mas para ficar mais fácil e principalmente para quem está dando os primeiros passos em rails resolvi fazer uma pequena introdução sobre o assunto.
O Observer é um objeto que se responsabiliza por “escutar” os eventos que ocorrem com outro objeto. Ou seja, qualquer alteração feito no objeto observado será analizado e poderá executar uma ação. Isto é muito útil para gravar logs, enviar emails e outros.
Vamos criar um projetinho para entender:
$ rails observers
$ cd observers
$ script/generate scaffold User name:string phone:string age:integer
$ rake db:migrate
Acima criamos um projeto e geramos uma entidade User e seus atributos, e migramos o banco. Vamos criar agora a entidade de log e o observer:
$ script/generate model Log table:string action:string field:string \
old_value:string new_value:string comments:text
exists app/models/
...
$ script/generate observer user
exists app/models/
exists test/unit/
create app/models/user_observer.rb
create test/unit/user_observer_test.rb
$ rake db:migrate
Feito isto precisamos “ativar” o observer, e para isto basta adicionar no config/enviroment.rb
Agora podemos definir em qual momento ele vai gerar o log, antes ou depois de persistir o objeto:
- before_create, before_destroy, before_update, before_save, before_update
- after_create, after_destroy, after_update, after_save, after_update
Como tudo no rails os nomes já definem o que cada um vai fazer. Vamos gerar um log quando criar ou excluir um usuário. Para isto, vamos abrir o arquivo user_observer.rb
Vamos acessar http://localhost:3000/users e criar um user e veja o log gerado:
Simples? Muito. Agora vamos pedir para ele observar o que foi alterado em um objeto:
O log gerado:
Aqui temos apenas uma introdução do que podemos ter com o Observer. Bons estudos.
Ótimo post Ozéias!
Sem dúvidas isso vai servir para muita gente. Simples e direto!
Só instigou ainda mais a imaginação para quem ainda tem alguns jobs usando o Rails 1.2.3 😉
Abraços
Complica a parada quando vc precisa saber qual usuário efetuou a ação.
Seria uma boa já publicar um artigo implementando isso.
@bruno boa dica, vou preparar algo.
Deeeeeeesiiign Paaaaaatern Véééééi!!!
É sempre bom aprender um em qualquer linguagem. =D
Bruno Azisaka, para isso você precisaria passar a sessao com o usuário do controller para o modelo como argumento. Agora caso você queira quebrar literalmente com a arquitetura MVC pode tentar usar isso:
http://m.onkey.org/2007/10/17/how-to-access-session-cookies-params-request-in-model