2014-08-27 17 views
5

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 

Odpowiedz

7

Nie możesz tego zrobić w prosty sposób?

module StateMachines::JobStateMachine 
    def self.included(base) 
    base.send(:include, AASM) 

    aasm do 
     ... 
    end 
    end 
end 
+0

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

Powiązane problemy