Załóżmy, że mam tę klasę (podjętą bezpośrednio z aasm dokumentacji):AASM: Oddzielenie definicji maszyny państwowej z definicji klasy
class Job < ActiveRecord::Base
include AASM
aasm do
state :sleeping, :initial => true
state :running
state :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
end
nie jak dużo fakt, że mam swój stan maszyny definicja zmieszana z definicją mojej klasy (ponieważ oczywiście w prawdziwym projekcie dodam więcej metod do klasy Job).
Chciałbym, aby oddzielić definicję maszyny stanu w module tak, że klasa Praca może być coś wzdłuż linii:
class Job < ActiveRecord::Base
include StateMachines::JobStateMachine
end
Następnie utworzony plik job_state_machine.rb w app/models/state_machines o zawartości podobnej do:
module StateMachines::JobStateMachine
include AASM
aasm do
state :sleeping, :initial => true
state :running
state :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
end
ale to nie działa, ponieważ AASM jest zawarte w module nie w klasie Job ... próbowałem nawet zmieniając moduł:
module StateMachines::JobStateMachine
def self.included(base)
include AASM
aasm do
state :sleeping, :initial => true
state :running
state :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
end
end
ale nadal nie działa ... wszelkie podpowiedzi lub sugestie są bardzo cenne.
Dzięki, Ignazio
EDIT:
Dzięki Alto, prawidłowe rozwiązanie to:
module StateMachine::JobStateMachine
def self.included(base)
base.send(:include, AASM)
base.send(:aasm, column: 'status') do
....
end
end
end
i oczywiście pamiętać, aby zawierać definicję machiny państwowej w główna klasa taka jak ta:
include StateMachine::JobStateMachine
Dziękuję altowi, postawiłeś mnie na właściwej ścieżce, zmienię moje pytanie w odniesieniu do tego, kto przyjdzie tutaj w przyszłości – Gnagno