簡體   English   中英

aasm ruby​​ gem:超級用戶沒有限制

[英]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的模型層中做出決策一直被認為是代碼氣味,因此實現目標的幾種簡潔方法可能是:

  1. 要實現一些繼承,例如:

     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 

    然后,你應該得到一個CommonUserJobAdminJob根據用戶的角色實例,並調用的狀態變化。

  2. 實現一些組合(請參閱組合而不是繼承 ),這意味着您將特定aasm角色的aasm代碼移動到模塊並在運行時使用特定的一個擴展job對象。

請注意,這兩個建議都會使您的基本Job類完全沒有任何aasm驗證。 這似乎與常見的Rails方式相矛盾,但遵循DCI范式 ,該范例指出我們應該將系統(域模型)與系統(功能)的內容分離。 基類實例應該仍然能夠獲得其當前狀態。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM