1

Можно ли безопасно выполнить переход в AASM с его именем?Как выполнить переходы в AASM с контроллера?

Что я делаю сейчас в AASM:

if order.aasm.events.include? params[:event] 
    order.send(params[:event]) 
    order.save 
end 

Что я мог сделать в state_machine

order.state_event = params[:event] 
order.save 
+1

Я нуждался в этом в моем проекте также и создали беспокойство, чтобы сделать это: https://gist.github.com/ spieker/a01966e2dd586b47b04f –

ответ

0

Вы можете включить свой aasm do блок? Раньше я не использовал state_machine, но это не то, как один типично использует aasm. Вам не нужно будет когда-либо отправлять переход; скорее вы просто вызываете событие, и ваш переход состояний происходит автоматически на основе созданных вами правил события/перехода.

Вот небольшой пример.

aasm do 
    state :draft 
    state :review 
    state :accepted 
    state :rejected 

    event :submit do 
    transitions :from => :draft, :to => :review 
    transitions :from => :review, :to => :accepted 
    end 

    event :reject do 
    transitions :form => :review, :to => :rejected 
    end 
end 

Теперь в приведенном выше примере, если объект находится в состоянии черновика, и вы называете object.submit это будет переход от draft to review и если вы находитесь в обзоре состояния object.submit будет переход от review to accepted.

Также обратите внимание, что вместо вызова события и последующего вызова save вы можете добавить ! к имени события, и сохранение произойдет автоматически после завершения перехода.

Таким образом, вместо

object.submit 
object.save 

Вы можете просто позвонить

object.submit! 
+0

Когда я сказал переход, я на самом деле имел в виду событие. Я пытаюсь сделать управление объектом управляемым через API. Должен ли я выполнять события, используя 'object.send (" # {params [: event]}! ")' Или есть лучший способ сделать это? – makhan

+0

В этом случае вы можете использовать 'send' на объекте так, как вы описали. Я бы порекомендовал установить ваш аспект, как этот 'aasm: whiny_transitions => false do', это просто вернет true или false вместо повышения исключения, если это событие в настоящее время недействительно. Это устраняет необходимость вашей проверки. – bigtunacan