5

Estoy buscando un plugin de máquina de estados relativamente simple para un proyecto Rails 3/Active Record.¿Qué plugin de State Machine recomiendas para Rails?

que he hecho un poco de investigación y llegar a los siguientes plugins:

Pero todos parecen muy similares, por lo que estoy curioso por saber si alguien ha tenido real experiencia mundial con cualquiera de ellos.

Gracias!

+0

Si ayuda a tener una idea de su relativa popularidad, se puede ver aquí: https://www.ruby-toolbox.com/categories/state_machines –

+0

Comentario: Hemos creado [un breve vídeo] (http: //www.platform45.com/videos/show/10) explicando el flujo de estado que puede ayudar. – Neil

Respuesta

12

state_machine parece ser la única persona que dice usar, al menos con quién he hablado. Es independiente del entorno, por lo que no tiene que usar una máquina de estado en una parte de su aplicación, y una completamente diferente en otra parte de su aplicación.

actualización de febrero el año 2015

Máquina de Estado es, por desgracia ya no se mantiene y hay muchos problemas, lo que hace que sea una opción menos favorable. Sin embargo, this fork del proyecto se mantiene activamente y parece ser estable.

4

Terminé usando stateflow y me gusta. https://github.com/ryanza/stateflow

Funciona con rails 3.0, y es similar en el enfoque al código de máquina de estado que estaba en varios de los rieles 3.0 betas, pero se cayó de la versión final. No lo he seguido para ver cuál es la idea actual de tener una máquina de estado dentro de los rieles, pero supongo que si una máquina de estado se reintegra en una versión futura será algo así. Espero que eso signifique cambios mínimos en el código si alguna vez quiero soltar la gema y usar la funcionalidad central

+0

No había oído hablar de este - realmente me gusta la sintaxis. Acabo de agregarlo a la lista de arriba. –

+0

Stateflow tiene la ventaja de las transiciones dinámicas (donde puede tener alguna lógica de negocios que determine el siguiente estado), en caso de que sea algo que necesite. – crishoj

3

Me acercaría a Transitions con cuidado. El autor/extractor dice que no tiene tiempo para mantenerlo, y generalmente prefiere state_machine en sus nuevos proyectos.

Por otro lado, funciona (aunque consulte los problemas abiertos para ver si funciona en su caso). Estoy usando Transitions en un proyecto, pero para una máquina de estado trivial.

He usado actúa como máquina de estado antes, en un proyecto Rails 2, y lo hizo muy bien (incluso con máquinas de estados muy complejas)

0

Incluso las gemas de máquina de estados más simples tenían forma más características de lo que necesitaba , así que decidí lanzar mi propia solución.Probé Transitions y Stateflow, pero tuve problemas menores con ambos.

+0

Es un poco interesante saber lo que ha elegido, pero no estoy seguro de que esto califique como respuesta. ¿Por qué no hacer una actualización de tu pregunta? – iconoclast

+0

Buen punto. Lo dejo como una respuesta, pero lo desamarco como "la" respuesta, ya que es realmente una pregunta abierta. –

+0

Para calificar realmente como una respuesta, ¿no crees que deberías compartir el código que usaste? De lo contrario, esta Q & A es de la forma "¿Cómo debo hacer X?" "Hice X a mi manera". – iconoclast

2

SimpleStateMachine es una DSL simple para decorar los métodos existentes con guardias de transición de estado.

class LampSwitch 
    extend SimpleStateMachine 

    def initialize 
    self.state = 'off' 
    end 

    event :push_switch, :off => :on 
end 

lamp = LampSwitch.new 
lamp.state   # => 'off' 
lamp.off?   # => true 
lamp.push_switch # 
lamp.state   # => 'on' 
lamp.on?   # => true 

Funciona con validaciones ActiveModel y permite que los eventos que se llaman con argumentos:

class User < ActiveRecord::Base 
    ... 
    def activate_account(activation_code) 
    if activation_code_invalid?(activation_code) 
     errors.add(:activation_code, 'Invalid') 
    end 
    end 
    event :activate_account, :invited => :activated 
end 

user = User.new 
user.activate_account!('INVALID') # => raises ActiveRecord::RecordInvalid 
user.activated?      # => false 
user.activate_account!('VALID') 
user.activated?      # => true 

Se puede rescatar a excepción:

def download_data 
    raise Service::ConnectionError 
end 
event :download_data, Service::ConnectionError => :download_failed 

user.download_data    # catches Service::ConnectionError 
user.state      # => "download_failed" 
user.state_machine.raised_error # the raised error 
0

recomendaría Workflow como me siento es el más fácil de todas las máquinas de estado disponibles.