Гем Workflow (Процесс) добавляет в объект способность хранить очерёдность состояний и возможных действий.
Процесс имеет разные состояния (State). В единицу времени только одно состояние может быть активно. Состояния могут переходить (Transition) от одного к другому. Чтобы совершить переход, должно произойти какое-то событие (Event). При активации события, можно исполнить произволное дополнительное действие (Action). Другими словами каждое состояние содержит произволное количество событий, запуск события ведёт к другому состоянию, и возможному запуску какого-то действия связанного с этим событием. Кроме того можно отследить вход и выход из состояния, поймать ошибку при переходе.
Для начала работы с гемом его необходимо установить gem install workflow
. Я подготовил небольшой пример работы:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
require 'workflow' class Article include Workflow workflow_column :state workflow do state :new do event :review, transition_to: :awaiting_review end state :awaiting_review do event :accept, transition_to: :accepted event :reject, transition_to: :rejected end state :accepted state :rejected end def review p "Запуск события review" end end article = Article.new p "Текущее состояние" p article.current_state.to_s p "Запись находится в состоянии new - #{ article.new? }" p "Запись можно отправить на review - #{ article.can_review? }" p "Запись можно принять или отклонить - #{ article.can_accept? } / #{ article.can_reject? }" p "-------------------------------------" p "Доступные события в этом состоянии" p article.current_state.events p "-------------------------------------" p "Переход к другому состоянию" article.review! p "-------------------------------------" p "Доступные события в этом состоянии" p article.current_state.events |