AOP en Rails???? Marchando!!!!!!!
Observers. Si conoces como funciona AOP te vas a maravillar con lo sencillo que va a ser añadir control de aspectos a nuestras clases Model en Rails. De echo, si lo pensamos un momento es el punto más obvio del modelo Rails en el que añadir esta funcionalidad. Nos va a permitir añadir control a los puntos de entrada y salida de las operaciones CRUD que nos proporciona ActiveRecord::Base, es decir, new, create, update, delete, save.
Lo que nos propone ActiveRecord::Observer es el poder crear metodos que se ejecuten antes o después de las invocaciones a cada uno de estos métodos. La forma es muy sencilla. Estos son los pasos para hacer un log para cada operación de guardado. Haremos un pre-log y un post-log.
- Creamos una clase que herede de ActiveRecord::Observer y la nombraremos con el nombre del Modelo a observar seguido de Observer, es decir, si nuestro modelo es Shop la llamamos ShopObserver.
- Guardamos el archivo en la carpeta app\model con el nombre shop_observer.rb
- definimos un método before_save en el que ponemos la funcionalidad a ejecutar ANTES de guardar. En nuestro caso, el log.
- definimos un método after_save donde incluimos funcionalidad para DESPUES de guardar.
- Editamos el archivo config/environment.rb modificando la entrada config.active_record.observers = :shop_observer
class ShopObserver < ActiveRecord::Observer def before_save(a_shop) a_shop.logger.info("PRE-LOG - Shop name = #{a_shop.name}") end def after_save(a_shop) a_shop.logger.info("POST-LOG - Shop name = #{a_shop.name}") end end Y ya esta todo. Ahora podemos ejecutar la consola del entorno con ruby script/console para testear lo que hemos creado. Si ejecutamos
shop = Shop.new(:name=>"ebay")
shop.save
vamos a ver que el archivo development.log va a contener dos entradas de log ejecutadas antes y después de llamar al método save.
Yo estoy cada vez más encantado con la funcionalidad que me proporciona este framework DE SERIE, y sin necesidad de añadirle plugins o librerías externas.