Rails Summit Latin America

Acts_as_trackable Plugin

June 3rd, 2007

Este plugin fue escrito con la intención de llevar un tracking de cambio de estados en modelos.

El codigo esta escrito en ingles pero los comentarios y los specs son bilingües ingles/español Es compatible con acts_as_state_machine

Si tienes un modelo que va cambiando de estado a través del tiempo y quieres rastrear esos cambios, este plugin te lo facilita.

El uso es simple:

class Orden < ActiveRecord::Base
  acts_as_trackable, :track_method => :estado
end

Indicando :track_method le estaremos diciendo que metodo nos devolvera el estado de la instancia de nuestro modelo y en el before_save si es distinto del anterior se creara un nuevo track.

Fue desarrollado utilizando rspec aqui van los specs:

describe "Cuando genero una order. When an order is created" do

  before(:each) do
    @order = Order.new(:customer=>"Capitan Piluso",:state=>"created")
  end
  it "Deberia tener un track asociado cuando se graba. Should have a new track associated" do
    @order.should have(0).tracks
    @order.save
    @order.should have(1).tracks
    @order.tracks[0].should be_an_instance_of(Track)
  end
  it "Deberia guardar la instancia serializada en track. Should save the instance serialized" do
    @order.save
    @order.tracks.last.retrieve_old_instance.should be_an_instance_of(Order)
  end

end

describe "Cuando cambia el estado de una order existente. When an order state is changed" do
  before(:each) do
    @order = Order.create(:customer=>"El Manosanta",:state=>"created")
    @order.state = "shipped"
    @order.save
  end
  it "Deberia crear otro track. Should create another track" do
    @order.should have(2).tracks
    @order.current_track.state.should == "shipped"
    @order.tracks.first.state.should == "created"
  end
end

describe "Con varios tracks. With several tracks" do
  fixtures :orders
  it "deberia poder recuperar la instancia de order en otro momento, should retrieve an old instance of order" do
    @order = orders(:created_1)
    @old_order = orders(:created_1)
    @order.customer = "Dentaduras Sonria Ya"
    @order.state = "shipped"
    @order.save
    @order.state = "returned"
    @order.save
    @order.tracks[0].retrieve_old_instance.should eql(@old_order)
    @order.tracks[1].retrieve_old_instance.should !eql(@old_order)
    @order.tracks[1].retrieve_old_instance.should eql(@order)
  end

end

Lo pueden encontrar en

svn://svn.virtualizar.com.ar/projects/plugins/acts_as_trackable/

Aqui escribi un artículo sobre BDD y rspec, el código esta outdated, pero el concepto esta bien. BDD – La evolucion natural del TDD

Esperamos les sea de utilidad

5 Responses to “Acts_as_trackable Plugin”

  1. nachokb Says:

    Muy bueno! Probablemente lo utilice en poco tiempo.

    Gracias por el plugin y por los specs…

    nachokb

  2. Brandon Keene Says:

    Very nice! I was going to write something like this myself. Do you use this with acts_as_state_machine?

    This is how I will likely use it.

  3. Peterpunk Says:

    Yes, we use it with acts_as_state_machine. This release is compatible but not integrated, but can work with without problems. The thing that you have to consider to use with state_machine is that this plugin require the save method to work, so you need to save your model in every state change with save method. Thanks for comments! and enjoy it ;-)

    As usual I will answer in spanish too.

    En español: Si, lo usamos con acts_state_machine. Este release del plugin es compatible pero no esta integrado, pero puede trabajar con acts_as_state_machine sin problemas. Lo que tienes que tener en cuenta para usarlo con state_machine es que el plugin requiere el metodo save para que funcione, por lo tanto necesitas grabar tu modelo con cada cambio de estado con el metodo save.

    Gracias por comentar y disfrutalo!

    P

  4. Peterpunk Says:

    Brandon post a patch to enhance acts_as_trackable and acts_as_state_machine works when the initial state is created.

    Now is patched, thanks Brandon.

    Español Brandon posteo un patch para mejorar el funcionamiento de acts_as_state_machine y acts_as_trackable cuando el etado inicial es creado.

    Ya esta patcheado, gracias Brandon.

  5. Brandon Keene Says:

    Glad I could help. Keep up the good work peterpunk.

    Gracias!

Sorry, comments are closed for this article.