Зарегистрировать обратный вызов для всех переходов в AASM? - PullRequest
2 голосов
/ 16 ноября 2009

Есть 2 метода, которые я хочу вызывать после каждого перехода состояния. Прямо сейчас я делаю:

  aasm_event :nominate_for_publishing, :before => [:set_state_last_updated_by, :set_state_updated_at] do
    transitions :to => :under_review, :from => [:work_in_progress]
  end

  aasm_event :publish, :before => [:set_state_last_updated_by, :set_state_updated_at] do
    transitions :to => :published, :from => [:work_in_progress, :under_review], :guard => :is_publishable?
  end

  aasm_event :unpublish, :before => [:set_state_last_updated_by, :set_state_updated_at] do
    transitions :to => :work_in_progress, :from => [:published, :under_review]
  end

Очевидно, что это не лучший подход. Я дублирую код и, что более важно, я ассоциирую обратные вызовы с конкретными переходами, когда они действительно применяются к конечному автомату в целом. Какой лучший способ справиться с этим?

Ответы [ 2 ]

2 голосов
/ 16 ноября 2009

Почему бы просто не использовать грязные атрибуты, чтобы проверить, изменилось ли состояние при сохранении?

Вот так,

class Model > ActiveRecord::Base

  before_save :set_state_updates

  private

  def set_state_updates
    if state_changed?
      set_state_last_updated_by
      set_state_updated_at
    end
  end 

end
0 голосов
/ 01 февраля 2016

Взгляд обратные вызовы Aasm . Вы хотите использовать метод after_all_transitions.

...