Pregunta

Recientemente tuve que extender los estados de asasm para la última versión de restful_authentication (github) en una de mis aplicaciones. Eliminé el '' incluir Autorización :: AasmRoles '', copié los estados y eventos existentes del complemento e hice los cambios necesarios para admitir un '' publicado '' adicional estado en mi modelo de cuenta.

¿Alguien tiene una forma más limpia de manejar esto? Es decir. solo anular los eventos estatales? Pude agregar nuevos eventos usando el complemento tal cual, sin embargo, no pude anular los eventos de estado que ya estaban en restful_auth, así que tuve que eliminar la inclusión y escribirlo yo mismo como punto de partida.

¿Fue útil?

Solución

La adición de un estado en AASM consiste en crear un nuevo objeto State, que luego se agrega a AASM :: StateMachine [User] .states array, que se ve así:

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

Lo que hay que notar aquí es que no permitirá anular un estado una vez que esté configurado. Si el estado con el mismo nombre se establece nuevamente, el método create_state simplemente lo ignora. Para resolver este problema, puede usar algo como esto en su modelo de Usuario:

# 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 solo está redefiniendo el estado, debería estar bien ahora. Pero si desea eliminar el estado por completo, también debe definir el método definido en el cuerpo del método aasm_state. Debería ser posible llamando a algo como:

undef_method :name

La situación debería ser la misma con los eventos (solo use "eventos" en lugar de "estados" en el código). Idealmente, conviértalo en el método de clase del modelo de usuario que anule los métodos definidos en el módulo AASM. En el caso de los estados se vería así:

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

Advertencia: puede que no tenga razón. Este código no ha sido probado, lo acabo de descubrir buscando en el código fuente de AASM.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top