Domanda

Di recente ho dovuto estendere gli stati di aasm per l'ultima versione di restful_authentication (github) in una delle mie app. Ho rimosso il "include Authorization :: AasmRoles", copiato gli stati e gli eventi esistenti dal plugin e apportato le modifiche necessarie per supportare un ulteriore "pubblicato". stato sul mio modello di account.

Qualcuno ha un modo più pulito di gestirlo? Cioè semplicemente ignorare gli eventi di stato? Sono stato in grado di aggiungere nuovi eventi usando il plug-in così com'è, tuttavia non sono stato in grado di sovrascrivere gli eventi di stato già in restful_auth, quindi ho dovuto rimuovere l'inclusione e scriverlo da solo usandolo come punto di partenza.

È stato utile?

Soluzione

L'aggiunta di uno stato in AASM consiste nella creazione di un nuovo oggetto State, che viene quindi aggiunto all'array AASM :: StateMachine [User] .states, che assomiglia a questo:

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

La cosa da notare qui è che non consentirà di ignorare uno stato una volta impostato. Se lo stato con lo stesso nome viene nuovamente impostato, il metodo create_state lo ignora. Per risolvere questo problema, puoi usare qualcosa del genere nel tuo modello utente:

# 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 ...

Se stai semplicemente ridefinendo lo stato, dovresti andare bene ora. Ma se vuoi rimuovere completamente lo stato, dovresti anche definire il metodo definito nel corpo del metodo aasm_state. Dovrebbe essere possibile chiamare qualcosa come:

undef_method :name

La situazione dovrebbe essere la stessa con gli eventi (basta usare "eventi" invece di "stati" nel codice). Idealmente, rendilo il metodo di classe del modello utente che ignora i metodi definiti nel modulo AASM. Nel caso degli stati sembrerebbe così:

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

Avvertenza: potrei non avere ragione. Questo codice non è stato testato, l'ho appena capito esaminando il codice sorgente di AASM.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top