AASM:Проверка того, какой объект перемещает состояние вперед
-
20-09-2019 - |
Вопрос
Я использую AASM из http://elitists.textdriven.com/svn/plugins/acts_as_state_machine/trunk
В моем примере у меня есть сайт Karate dojo rails.На сайте учителя могут управлять классами, которые они проводят, и переводить своих учеников на следующий логический уровень.
Моя модель "Student" использует AASM для прогрессирования ремня, и она определяется следующим образом:
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
...и модель Учителя определяется следующим образом...
class Teacher < ActiveRecord::Base
def Promote_Student(pupil)
pupil.Graduate!
end
end
Есть ли способ гарантировать, что только учителя могут вызывать "Студент.Выпускник!"?Я видел команду ":guard", но, похоже, у меня могут быть только функции, которые проверяют текущий объект (Ученик), а не объект, который вызвал функцию (Учитель).
Также похоже, что я не могу добавить параметр к своему событию, например...
event :Gradate(teacher_id) do
...
end
... что было бы идеально.
Решение
Я думаю, что такого рода принудительное исполнение не требуется при условии, что вы правильно кодируете.Вы сами применяете это в коде.
Вы можете написать функцию, такую как Teacher#promote (ученик), а затем написать несколько комментариев к событию graduate, указав, что не следует вызывать его напрямую, а вместо этого вызвать Teacher#promote.
также в методах и символах camel_case предпочтительнее использовать заглавную букву без первой буквы.