Ruby on Rails
Estados del modelo: AASM
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.