AASM:验证哪个对象正在向前移动状态

时间:2009-08-30 02:32:58

标签: ruby-on-rails validation acts-as-state-machine

我正在使用http://elitists.textdriven.com/svn/plugins/acts_as_state_machine/trunk

中的AASM

在我的例子中,我有一个空手道dojo rails网站。在网站上,教师可以管理他们指导的课程,并将他们的学生转移到下一个逻辑带。

我的“学生”模型使用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

有没有办法确保只有教师可以打电话给“Student.Graduate!”?我见过“:guard”命令,但似乎我只能检查当前对象(学生)的函数,而不是调用函数的对象(教师)。

我似乎无法在我的活动中添加一个参数,如...

event :Gradate(teacher_id) do
   ...
end

......这将是理想的。

1 个答案:

答案 0 :(得分:0)

我认为只要您正确编码,就不需要这种强制执行。您可以在代码中自行执行此操作。

您可以编写一个函数,例如教师#province(学生),然后在毕业生活动上写一些评论,说明不要直接调用它,而是调用教师#provate而不是。

也是camel_case whitout首字母大写是方法和符号的首选。