2014-09-30 78 views
6

在ActiveSupport :: Concern上下文中訪問包含類的受保護常量的最簡單方法是什麼?在ActiveSupport中訪問包含類的受保護常量::關注

實例類:

module Printable 
    extend ActiveSupport::Concern 

private 
    def print_constant 
     puts MY_CONSTANT 
    end 
end 

class Printer 
    include Printable 

    def print 
     print_constant 
    end 

private 
    MY_CONSTANT = 'Hello'.freeze 
end 

該解決方案產生一個錯誤:

NameError: uninitialized constant Printable::MY_CONSTANT 

我知道,似乎工作的一個替代的:

puts self.class::MY_CONSTANT 

但是,它不感覺不錯。 :-)

有什麼更好的建議?

+2

你的問題是我的答案。雖然我同意它感覺不對,但你的問題最終給了我一個解決方案,至少工作。 – 2014-12-25 21:14:44

回答

0

從關注點訪問包含類的常量並不是一個好主意。

一個關注不應該有它包含在類(太多)知識

我會去爲一個共同的API在關注並在必要時覆蓋......這樣的:

​​
+1

你會有一個方法的惡性通貨膨脹的順序(包括類的數量)x(使用常量的方法的數量):) – 2015-12-30 22:35:49

5

首先,你應該把#print_constantincluded塊:

module Printable 
    extend ActiveSupport::Concern 

    included do 
    private 

    def print_constant 
     puts MY_CONSTANT 
    end 
    end 
end 

現在有訪問類constan至少兩種方式噸MY_CONSTANT

  1. #included產量與base參數類似於Ruby的 #included

    module Printable 
        extend ActiveSupport::Concern 
    
        included do |base| 
        private 
    
        define_method :print_constant do 
         puts base::MY_CONSTANT 
        end 
        end 
    end 
    
  2. 另一種方法是從self.class打算:

    module Printable 
        extend ActiveSupport::Concern 
    
        included do 
        private 
    
        def print_constant 
         puts self.class::MY_CONSTANT 
        end 
        end 
    end 
    

ActiveSupport Concern Documentation