[英]aasm ruby gem: super user without restrictions
鉴于使用aasm gem的下一个模型:
class Job
include AASM
aasm do
state :sleeping, :initial => true
state :running, :cleaning
event :run do
transitions :from => :sleeping, :to => :running
end
event :clean do
transitions :from => :running, :to => :cleaning
end
event :sleep do
transitions :from => [:running, :cleaning], :to => :sleeping
end
end
end
我的Web应用程序上有两种类型的用户(普通用户和超级用户)。 我需要超级用户类型,能够调用他们想要的事件。 就像在state = cleaning的工作上调用#run一样。
所以,按照我的理解,我需要的是从在运行时解决过渡的。 如果用户是超级用户,则from将是所有状态,但如果用户不是超级用户,则每个用户将具有不同的状态。
有没有干净的方法呢? 你有什么想法?
在基于current_user
的模型层中做出决策一直被认为是代码气味,因此实现目标的几种简洁方法可能是:
要实现一些继承,例如:
CommonUserJob < Job # move your current AASM validations here end AdminJob < Job aasm do event :run do all_states = Job.aasm.states.map{|i| i.name} transitions :from => all_states, :to => :running end # other events here in same manner end end
然后,你应该得到一个CommonUserJob
或AdminJob
根据用户的角色实例,并调用的状态变化。
实现一些组合(请参阅组合而不是继承 ),这意味着您将特定aasm
角色的aasm
代码移动到模块并在运行时使用特定的一个扩展job
对象。
请注意,这两个建议都会使您的基本Job
类完全没有任何aasm
验证。 这似乎与常见的Rails方式相矛盾,但遵循DCI范式 ,该范例指出我们应该将系统(域模型)与系统(功能)的内容分离。 基类实例应该仍然能够获得其当前状态。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.