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.

5 Comments on “Usando o Observer no Rails

  1. Ó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

  2. Complica a parada quando vc precisa saber qual usuário efetuou a ação.

    Seria uma boa já publicar um artigo implementando isso.

  3. Deeeeeeesiiign Paaaaaatern Véééééi!!!
    É sempre bom aprender um em qualquer linguagem. =D