Pergunta

Eu tive recentemente para estender os estados AASM para a versão mais recente do restful_authentication (github) em um dos meus apps. Eu removi o "incluem autorização :: AasmRoles", copiados os estados existentes e eventos do plug-in e fez as mudanças necessárias para apoiar um estado adicional "publicado" no meu modelo de conta.

Alguém tem uma maneira mais limpa para lidar com isso? Ou seja, apenas substituir os eventos estaduais? Eu era capaz de adicionar novos eventos usando o plugin como é, no entanto eu não era capaz de simplesmente substituir os eventos estaduais já em restful_auth então eu tive que remover a incluir e escrevê-lo eu mesmo usá-lo como um ponto de partida.

Foi útil?

Solução

A adição de um estado em AASM consiste na criação de um novo objeto de Estado, que é então adicionado a AASM :: StateMachine [usuário] .states matriz, que tem esta aparência:

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

A primeira coisa a notar aqui é que não vai permitir que para substituir um estado, uma vez que está definido. Se o estado com o mesmo nome é definido de novo, método create_state simplesmente ignora-lo. Para slove este problema, você pode usar algo como isso no seu modelo User:

# 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 você está apenas redefinindo o estado que você deve estar bem agora. Mas se você deseja remover o estado inteiramente, você deve cancele o método definido no corpo do método aasm_state também. Deve ser possível com a chamada algo como:

undef_method :name

A situação deve ser o mesmo com os eventos (apenas usar "eventos" em vez de "estados" no código). Idealmente, torná-lo método de classe de modelo de usuário que substitui métodos definidos no módulo AASM. No caso dos estados que seria parecido com isto:

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

Aviso: Eu não poderia estar certo. Este código é testado, eu só percebi isso por olhar para o código-fonte da AASM.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top