[英]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.