2014-08-27 10 views
5

nehme an, ich habe diese Klasse (direkt von der AASM-Dokumentation entnommen):AASM: die Zustandsmaschine Definition aus der Klassendefinition Trennung

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 

ich viel nicht die Tatsache, dass ich meine Zustandsmaschine haben Definition gemischt mit meiner Klassendefinition (da ich natürlich in einem realen Projekt mehr Methoden zur Jobklasse hinzufügen werde).

Ich möchte den Zustand Maschinendefinition in einem Modul trennen, so dass die Job-Klasse etwas entlang der Linie sein können:

class Job < ActiveRecord::Base 
    include StateMachines::JobStateMachine 
end 

ich dann eine job_state_machine.rb Datei in app/models/state_machines erstellt mit einem Gehalt ähnlich wie:

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 

aber dies nicht funktioniert, weil AASM im Modul nicht in der Job-Klasse ... enthalten ist habe ich versucht, auch das Modul an sich ändernde:

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 

aber immer noch es funktioniert nicht ... jeder Hinweis oder Vorschlag wird sehr geschätzt.

Danke, Ignazio


EDIT:

Dank Alto, die richtige Lösung ist dies:

module StateMachine::JobStateMachine 

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

    base.send(:aasm, column: 'status') do 
    .... 
    end 
    end 
end 

und natürlich erinnere mich an die Zustandsmaschine Definition enthalten in die Hauptklasse wie folgt:

include StateMachine::JobStateMachine 

Antwort

7

Können Sie das nicht einfach machen?

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

    aasm do 
     ... 
    end 
    end 
end 
+0

Danke alto, du legst mich auf den richtigen Weg, ich werde meine Frage entsprechend für jeden ändern, der in Zukunft hierher kommen wird – Gnagno