Máquina de Estados en Ruby on Rails con AASM

La gema AASM sirve para agregar una máquina de estados a clases de Ruby.

Los vamos a utilizar en un modelo.

Nuestro modelo tiene una columna llamada state de tipo string

 

Añadimos la gema de AASM en el GemFile

gem install aasm

Instalamos

bundle install

 

Añadimos en nuestro modelo Article el modulo de AASM que ofrece la gema y  nuestra maquina de estados

class Article < ApplicationRecord
  include AASM
  .
  . 

  aasm column: "state" do
    state :in_draft, initial: true
    state :published

    event :publish do
      transitions from: :in_draft, to: :published
    end

    event :unpublish do
      transitions from: :published, to: :in_draft
    end

  end

  .
  .

En este ejemplo tenemos 2 estados declarados, in_draft (borrador) y published (publicado).

El estado inicial en el que inicia nuestra columna es el de in_draft (todos los artículos que creemos se crearan como draft por defecto)

Las transiciones entre estados con AASM se hacen mediante eventos, en este caso publish y unpublish

  • El evento publish pasa del estado in_draft al estado published.
  • El evento unpublish pasa del estado published al estado in_draft.

 

Ahora desde consola hacemos las pruebas con metodos que nos proporciona la gema AASM:

article_example = Article.last    #<Article id: 1,...state: "in_draft">


article_example.publish!          #<Article id: 1,...state: "published">

article_example.may_publish?      #False, porque para ir al estado published debo estar en el estado in_draft

article_example.may_unpublish?    #True

article_example.published?        # True


article_example.unpublish!        #<Article id: 1,...state: "in_draft">