acts_as_state_machine: Gerenciando estados de um Model Rails
Dezembro 11, 2007
Acts as State Machine eh um plugin do Rails que visa facilitar o gerenciamento de estados de um dado model ActiveRecord, implementando assim uma Maquina de Estado Finito. O acts_as_state_machine carrega o conceito de eventos. Que sao blocos de codigo responsaveis pelas transicoes de um estado do Model para o outro. Suponhamos, por exemplo, que voce queira controlar os estados das tarefas que voce irah realizar durante um dia. Com o acts_as_state_machine voce poderia ter algo parecido com o seguinte:
class Tarefa < ActiveRecord::Base
# Inicialmente a Tarefa estarah no estado 'Pendente'
acts_as_state_machine :initial => :pendente
state :pendente
state :iniciada, :enter => Proc.new {|o| Mailer.send_notice(o)}
state :concluida
state :cancelada
# No evento 'iniciar' eh realizada a transicao do estado 'pendente' para 'iniciada'
event :iniciar do
transitions :from => :pendente, :to => :iniciada
end
event :concluir do
transitions :from => :iniciada, :to => :concluida
end
event :cancelar do
transitions :from => :pendente, :to => :cancelada
end
end
Para cada estado, um metodo “<nomedoestado>?” serah criado, e para cada evento, um metodo “<nomedoevento>!” serah criado:
t = Tarefa.create # Cria a tarefa com seu estado inicial... t.state # => "pendente" t.iniciar! # Envia notificacao por email, e muda estado da Tarefa para "iniciada" t.iniciada? # => true # ... t.concluir! # Muda o estado da tarefa para "Concluida"
Como voce pode ver no codigo de exemplo, quando a nossa Tarefa mudar para o estado ‘iniciada’, (em consequencia da chamada ao metodo do evento ‘iniciar’), serah enviada uma notificacao por email. Isso eh feito por meio daquela Proc que foi passada como uma funcao de callback do estado :iniciada. Nos mostrando que temos a flexibilidade de fazer qualquer coisa na mudanca de um estado para o outro. Alih, no lugar de um bloco de codigo, pode ser passado um simbolo, com o nome de um metodo de instancia do model.
Instalacao
Para quem jah instalou um plugin Rails, instalar o acts_as_state_machine nao tem segredo algum! Na raiz da tua aplicacao Rails, digite:
./script/plugin install http://elitists.textdriven.com/svn/plugins/acts_as_state_machine/trunk/
Daih em diante eh soh usar!
Dezembro 14, 2007 às 7:49 pm
Muito bacana!
Fica a dica de utilizar o JFlap para modelar autômatos finitos mais complexos antes de ir pro código.
Janeiro 25, 2008 às 8:33 pm
e se por acaso eu quiser algo do tipo:
event :iniciar do
transitions :from => :all, :to => :iniciada
end
como seria o correto?
Janeiro 28, 2008 às 12:41 pm
Bem, nunca precisei colocar *todos* os estados como origem, mas como :from permite um Array de estados, uma das opções é você ter algo como:
event :iniciar do
transitions :from => [:pendente, :concluida], :to => :iniciada
end