Ajout d'un état dans AASM consiste à créer un nouvel objet de l'Etat, qui est ensuite ajouté à AASM :: StateMachine [utilisateur] .states tableau, qui ressemble à ceci:
def create_state(name, options)
@states << AASM::SupportingClasses::State.new(name, options) unless @states.include?(name)
end
La chose à remarquer Voici qu'il ne permettra pas de remplacer un état une fois qu'il est défini. Si l'état du même nom est défini à nouveau, la méthode create_state l'ignore. Pour slove ce problème, vous pouvez utiliser quelque chose comme ceci dans votre modèle utilisateur:
# 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 ...
Si vous êtes Redéfinition de l'état, vous devriez être bien maintenant. Mais si vous voulez supprimer complètement l'état, vous devez également annuler la définition de la méthode définie dans le corps de la méthode aasm_state. Il devrait être possible d'appeler quelque chose comme:
undef_method :name
La situation devrait être la même chose avec les événements (il suffit d'utiliser le code dans « événements » au lieu de « états »). Idéalement, faites-en la méthode de classe du modèle utilisateur qui remplace les méthodes définies dans le module AASM. Dans le cas des états, cela ressemblerait à ceci:
def aasm_state(name, options={})
states = AASM::StateMachine[self].states
states.delete(states.find{ |s| s == name.to_sym })
super(name, options)
end
Avertissement: Je n'ai peut-être pas raison. Ce code n'a pas été testé, je l'ai juste compris en regardant dans le code source de l'AASM.