Question

J'ai récemment dû étendre les états d'aasm de la dernière version de restful_authentication (github) dans l'une de mes applications. J'ai supprimé le "include Authorization :: AasmRoles", copié les états et les événements existants à partir du plug-in et apporté les modifications nécessaires pour prendre en charge un autre "publié". indiquer le modèle de mon compte.

Quelqu'un a-t-il une méthode plus propre pour gérer cela? C'est à dire. juste remplacer les événements d'état? J'ai pu ajouter de nouveaux événements en utilisant le plugin tel quel, mais je ne pouvais pas simplement remplacer les événements d'état déjà présents dans restful_auth; >

Était-ce utile?

La solution

L'ajout d'un état dans AASM consiste à créer un nouvel objet State, qui est ensuite ajouté au tableau AASM :: StateMachine [User] .states, qui ressemble à ceci:

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

Ce qu'il faut remarquer ici, c'est qu'il ne permet pas de remplacer un état une fois qu'il est défini. Si l'état portant le même nom est défini à nouveau, la méthode create_state l'ignore simplement. Pour résoudre ce problème, vous pouvez utiliser quelque chose comme ceci dans votre modèle d'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 ne faites que redéfinir l’état, tout devrait bien se passer. Mais si vous souhaitez supprimer complètement l'état, vous devez également définir 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 avec les événements (utilisez simplement "événements" au lieu de "états" dans le code). Idéalement, définissez-la comme 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

Attention: je n’ai peut-être pas raison. Ce code n’a pas été testé, je viens de le découvrir en consultant le code source de l’AASM.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top