🖥

#Ruby の aasm gem で after_all_transitions の Callback が出来ない : AASM::Unk

2019/11/07に公開

aasm/aasm: AASM - State machines for Ruby classes (plain Ruby, ActiveRecord, Mongoid)

問題

aasm do
end

の場合と

aasm(:some_name) do
end

の場合で callback の書き方が違う

解決


require 'aasm'

class Job
  include AASM

  aasm(:runner) do
    after_all_transitions :log_status_change

    state :sleeping, initial: true
    state :running, :cleaning

    event :run do
      transitions from: :sleeping, to: :running
    end

    event :clean do
      transitions from: :running, to: :cleaning
    end

    event :sleep do
      transitions from: [:running, :cleaning], to: :sleeping
    end
  end

  def log_status_change
    puts "changing from #{aasm(:runner).from_state} to #{aasm(:runner).to_state} (event: #{aasm(:runner).current_event})"
    # changing from sleeping to running (event: run)

    # puts "changing from #{aasm.from_state} to #{aasm.to_state} (event: #{aasm.current_event})"
    # There is no state machine with the name 'default' defined in Job! (AASM::UnknownStateMachineError)
  end
end

job = Job.new
job.run

理由

aasm(:name) do
end

で複数の StateMachine を作ることができるが、それにフックさせる callback メソッドは aasm の DSLではなく フラットなメソッドとして書くため、どの種類の StateMachine かを教える必要があるっぽい

Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/2678

チャットメンバー募集

何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ

Twitter

https://twitter.com/YumaInaura

公開日時

2019-11-07

Discussion