AASM:Проверка того, какой объект перемещает состояние вперед

StackOverflow https://stackoverflow.com/questions/1352928

Вопрос

Я использую 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 предпочтительнее использовать заглавную букву без первой буквы.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top