2014-01-29 72 views
0

場景:我的rails系統中有幾個ActiveRecord模型,都需要通過訪問控制列表進行控制。我有一個很好的ACL實現,可以實現我想要的功能,但是現在,檢查訪問調用都在每個受控對象類型(文檔,用戶等)中都被複制。在ruby中調用混合模塊中的類方法

我的直覺是將共享代碼放入模塊中,並將其與mixin結合使用。我不確定這是可能的(或者正確的語法是什麼),因爲混合模塊已經調用了ActiveRecord :: Base方法 - 有scope和has_many定義。

的想什麼,我要完成的例子是在這裏:

class Document < ActiveRecord::Base 
    include Controlled 
end 

module Controlled 
    has_many :acls, as: :controlled 
    scope :accessible, ->(uid, level){where("BUNCH OF SQL HERE")} 
    def access_convenience_methods 
    #stuff to provide easy access to authorization checks 
    end 
end 

然後,我不得不從的ActiveRecord :: Base的包括控制得到一些其他的車型。

模塊中的has_many和scope調用正在引起心痛 - 我無法從混合模塊中調用它們,顯然此上下文無法訪問外部類方法。

歡迎任何建議。

回答

2

你是正確的,你不能從模塊中調用類方法。

現在需要做到這一點的樣板代碼已包裝成ActiveSupport::Concern;它確實是你想要的。

[編輯]:我還建議你應該學習the boilerplate code itself,因爲它非常簡短易讀,是Ruby元編程的一個很好的例子。

0

啊哈,這顯然是一個紅寶石新手失敗 - 我需要把has_many和其他一次性調用放入一個包含的塊中。看起來像ActiveSupport :: Concern恰恰是在這裏使用的正確的東西:

module Controlled 
    extend ActiveSupport::Concern 
    included do 
    has_many :acls, as: :controlled 
    scope :accessible, ->(uid, level){where("BUNCH OF SQL HERE")} 
    end 
    def access_convenience_methods 
    #stuff to provide easy access to authorization checks 
    end 
end 
相關問題