AASM: Verificando qual objeto está movendo um estado para a frente
-
20-09-2019 - |
Pergunta
Estou usando AASM de http://elitists.textdriven.com/svn/plugins/acts_as_state_machine/trunk
No meu exemplo, tenho um local de karatê de dojo. No site, os professores podem gerenciar as aulas que instruem e transferem seus alunos para o próximo cinturão lógico.
Meu modelo de "aluno" usa aASM para progressão da correia e é definido assim:
class Student < ActiveRecord::Base
acts_as_state_machine :initial => :White_Belt
state :White_Belt
state :Yellow_Belt
state :Green_Belt
state :Purple_Belt
state :Brown_Belt
state :Black_Belt
event :Graduate do
transitions :from => :White_Belt, :to => :Yellow_Belt
...
transitions :from => :Brown_Belt, :to => :Black_Belt
end
end
... e o modelo do professor é definido assim ...
class Teacher < ActiveRecord::Base
def Promote_Student(pupil)
pupil.Graduate!
end
end
Existe uma maneira de garantir que apenas os professores possam ligar para "estudante.gradue!"? Eu já vi o comando ": guarda", mas isso parece que só posso ter funções que verificam o objeto atual (o aluno) e não o objeto que chamou de função (o professor).
Parece também que não posso adicionar um param ao meu evento como ...
event :Gradate(teacher_id) do
...
end
... o que seria ideal.
Solução
Eu acho que esse tipo de fiscalização não é necessário, desde que você code corretamente. Você aplica isso sozinho no código.
Você pode escrever uma função como o professor#Promover (aluno) e depois escrever alguns comentários no evento de pós -graduação afirmando não chamá -lo diretamente, mas ligar para o professor#promover.
Além disso, a capitalização da primeira carta camel_case é preferida em métodos e símbolos.