Frage

Ich hatte vor kurzem den AASM Staaten für die neueste Version von restful_authentication (Github) in einem meiner Anwendungen zu erweitern. Ich entfernte die, kopierte die bestehenden Zustände und Ereignisse aus dem Plugin und machte die notwendigen Änderungen zur Unterstützung eines zusätzlichen „veröffentlicht“ Zustandes meinetwegenen Modell „Authorization :: AasmRoles umfassen“.

Hat jemand eine saubere Art und Weise zu handhaben? D. h außer Kraft setzen nur die staatlichen Ereignisse? Ich konnte neue Ereignisse hinzufügen über das Plugin wie es ist, aber ich war nicht in der Lage, nur die staatlichen Ereignisse außer Kraft setzen bereits in restful_auth so musste ich entfernen die umfassen und schreiben Sie es aus mir es als Ausgangspunkt verwendet wird.

War es hilfreich?

Lösung

Das Hinzufügen eines Staates in AASM besteht einen neuen Staat Objekt zu schaffen, die dann zu AASM hinzugefügt wird :: State [Benutzer] .states Array, das wie folgt aussieht:

def create_state(name, options)
 @states << AASM::SupportingClasses::State.new(name, options) unless @states.include?(name)
end

Das, was hier zu bemerken ist, dass es keinen Staat außer Kraft setzen kann, sobald sie festgelegt ist. Wenn der Staat mit dem gleichen Namen wieder gesetzt ist, create_state Methode ignoriert es einfach. Slove dieses Problem, können Sie so etwas wie dies in Ihrem User-Modell verwenden:

# this will remove the state with name :name from the states array 
states = AASM::StateMachine[self].states
states.delete(states.find{ |s| s == :name })
# ... so we can define the state here again
aasm_state :name ...

Wenn Sie nur den Zustand neu zu definieren, sollten Sie jetzt in Ordnung sein. Aber wenn Sie den Zustand vollständig entfernen möchten, sollten Sie die Methode definiert im Körper aasm_state Methode auch aufgehoben werden sollen. Es soll mit Aufruf etwas wie möglich sein:

undef_method :name

Die Situation sollte gleich sein mit Ereignissen (nur verwenden „Events“ statt „Zustände“ im Code). Idealerweise macht es Klassenmethode Anwendermodell, das in AASM Modul definierten Methoden außer Kraft setzt. Im Fall von Staaten würde es so aussehen:

def aasm_state(name, options={})
  states = AASM::StateMachine[self].states
  states.delete(states.find{ |s| s == name.to_sym })
  super(name, options)
end

Warnung: Ich kann nicht richtig sein. Dieser Code ist nicht getestet, habe ich es einfach aus, indem sie in den Quellcode AASM suchen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top