2008-11-07 7 views
1

Récemment, j'ai dû étendre les états aasm pour 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 du plugin et apporté les modifications nécessaires pour supporter un état "published" supplémentaire sur mon modèle de compte.Meilleure façon d'étendre les états AASM restful_authentication

Est-ce que quelqu'un a une façon plus propre de gérer cela? C'est à dire. juste remplacer les événements d'état? J'ai été capable d'ajouter de nouveaux événements en utilisant le plugin tel quel, mais je n'ai pas pu remplacer les événements d'état déjà dans restful_auth, j'ai donc dû supprimer l'include et l'écrire moi-même en l'utilisant comme point de départ.

Répondre

1

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.

Questions connexes