Как сообщить AASM игоноре о событии, если это событие не применимо для текущего состояния (переход не определен)? - PullRequest
2 голосов
/ 16 ноября 2011

Я использую AASM.У меня есть событие, определенное с переходом.Работает, если событие инициировано и модель находится в состоянии: из состояния.Однако он генерирует исключение InValidTransition, если модель находится в любом другом состоянии.

aasm_state :first
aasm_sate  :second
aasm_state :third

aasm_event :myevent do
  transitions :from => :second, :to => :third
end

Теперь, если я сделаю mymodel.myevent!когда mymodel находится в: first или: третьем состоянии, aasm генерирует InValidTransition.Как я могу сказать Aasm игнорировать событие, когда в этих состояниях?

Ответы [ 3 ]

3 голосов
/ 09 августа 2012
aasm :column => :state, :whiny_transitions => false do
 state :first
 state  :second
 state :third

 event :myevent do
   transitions :from => :second, :to => :third
 end
end

Это должно делать то, что вы хотите.

0 голосов
/ 12 декабря 2016

Если вы хотите получить только разрешенные события вашего объекта AASM на основе текущего состояния, вы можете сделать:

#assuming your aasm object is saved to 'dummy' variable dummy.aasm.events(permitted: true)

, вы также можете получить имя с помощью

dummy.aasm.events(permitted: true).map(&:name)

0 голосов
/ 20 апреля 2012

Суть конечного автомата заключается в том, что вы хотите ограничить состояния, в которые вы можете переходить и из которых. Почему вы используете ограничения конечного автомата, если вы хотите описанную выше функциональность? Вы можете сделать то же самое с

def myevent
  self.update_attribute(:state, 'third') if self.state == 'second'
end

Или вы можете сделать это, если хотите продолжить использовать конечный автомат

aasm_event :myevent do 
    transitions :to => :second, :from => [:second]
    transitions :to => :second, :from => [:first]
end
...