Buscar..


Estado básico con AASM

Por lo general, terminará creando modelos que contendrán un estado, y ese estado cambiará durante la vida útil del objeto.

AASM es una biblioteca de habilitación de máquina de estado finito que puede ayudarlo a lidiar con tener un paso fácil a través del proceso de diseño de sus objetos.

Tener algo como esto en su modelo va bastante alineado con la idea de Fat Model, Skinny Controller , una de las mejores prácticas de Rails. El modelo es el único responsable de gestionar su estado, sus cambios y de generar los eventos desencadenados por esos cambios.

Para instalar, en Gemfile

gem 'aasm'

Considere una aplicación donde el usuario cite un producto por un precio.

class Quote

  include AASM

  aasm do
    state :requested, initial: true  # User sees a product and requests a quote
    state :priced                    # Seller sets the price 
    state :payed                     # Buyer pays the price
    state :canceled                  # The buyer is not willing to pay the price
    state :completed                 # The product has been delivered.

    event :price do
        transitions from: requested, to: :priced
    end

    event :pay do
        transitions from: :priced, to: :payed, success: :set_payment_date
    end

    event :complete do
        transitions from: :payed, to: :completed, guard: product_delivered?
    end

    event :cancel do
        transitions from: [:requested, :priced], to: :canceled
        transitions from: :payed, to: canceled, success: :reverse_charges
    end

   
  end

  private

  def set_payment_date
    update payed_at: Time.zone.now
  end
end

Los estados de la clase de cotización pueden irse sin embargo es mejor para su proceso.

Puede pensar que los estados son pasados, como en el ejemplo anterior o algo en otro tiempo, por ejemplo: precios, pagos, entregas, etc. El nombre de los estados depende de usted. Desde un punto de vista personal, los estados pasados ​​funcionan mejor porque su estado final seguramente será una acción pasada y se enlaza mejor con los nombres de los eventos, que se explicarán más adelante.

NOTA: tenga cuidado con los nombres que utiliza, debe preocuparse por no usar las palabras clave reservadas de Ruby o Ruby on Rails, como valid , end , being , etc.

Habiendo definido los estados y las transiciones, ahora podemos acceder a algunos métodos creados por AASM.

Por ejemplo:

Quote.priced  # Shows all Quotes with priced events
quote.priced? # Indicates if that specific quote has been priced
quote.price!  # Triggers the event the would transition from requested to priced.

Como puede ver, el evento tiene transiciones, estas transiciones determinan la forma en que cambiará el estado en la llamada del evento. Si el evento no es válido debido al estado actual, se generará un error.

Los eventos y transiciones también tienen algunas otras devoluciones de llamada, por ejemplo

guard: product_delivered?

Llamará al product_delivered? Método que devolverá un booleano. Si resulta falso, la transición no se aplicará y si no hay otras transiciones disponibles, el estado no cambiará.

success: :reverse_charges

Si esa traducción se realiza correctamente, se :reverse_charges método :reverse_charges .

Hay varios otros métodos en AASM con más devoluciones de llamada en el proceso, pero esto te ayudará a crear tus primeros modelos con estados finitos.



Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow