Pretty average AASM block right? Wrong….
I was just dealing with a bug where object.mark_sent! wasn’t saving the record.
included do include AASM aasm(:state) do state :in_checkout, initial: true state :processing state :available state :completed state :inactive state :sent event :start_processing! do transitions from: [:in_checkout, :processing, :available], to: :processing end event :processed! do transitions from: [:in_checkout, :processing], to: :available end event :mark_sent! do transitions from: [:available, :completed], to: :sent end after_all_transitions :set_aasm_timestamp end end
There’s a mark_sent! event, so surely mark_sent! should change the state and save the record right? No.
event :mark_sent! do transitions from: [:available, :completed], to: :sent end
This actually creates two method mark_sent! which makes the state change and it’s counterpart that also saves the record mark_sent!!. You can’t call a method with a double exclamation directly.
 pry(main)> e.mark_sent!!  pry(main)*  pry(main)* e.send(:'mark_sent!!')
When in Vegas, don’t define mark your events with an exclamation. DOH.