2014-09-30 6 views
6

Was ist der einfachste Weg, um auf die geschützte Konstante der eingeschlossenen Klasse im ActiveSupport :: Concern-Kontext zuzugreifen?Zugreifen auf die geschützte Klasse der eingeschlossenen Klasse in einem ActiveSupport :: Concern

Beispiel Klassen:

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 

Diese Lösung erzeugt einen Fehler:

NameError: uninitialized constant Printable::MY_CONSTANT 

ich bewusst eine Alternative bin, die zu funktionieren scheint:

puts self.class::MY_CONSTANT 

Aber es doesn fühle mich nicht richtig. :-)

Irgendwelche besseren Vorschläge?

+2

Ihre Frage war meine Antwort. Während ich zustimme, dass es sich nicht richtig anfühlt, gab mir Ihre Frage schließlich eine Lösung, die zumindest funktionierte. –

Antwort

0

Der Zugriff auf eine Konstante einer Include-Klasse aus einem Problem ist nicht wirklich eine gute Idee.

Eine Sorge sollte nicht (zu viel) Kenntnis der Klassen hat es in

enthalten ist ich für eine gemeinsame API in der Sorge gehen und außer Kraft setzen, wenn nötig ... wie folgt aus:.

module Printable 
    extend ActiveSupport::Concern 

private 
    def print 
     puts "" 
    end 
end 

class Printer 
    include Printable 

    def print 
     MY_CONSTANT 
    end 

private 
    MY_CONSTANT = 'Hello'.freeze 
end 
+1

Sie haben eine Methode Hyperinflation in der Reihenfolge (Anzahl der Klassen einschließlich) x (Anzahl der Methoden mit der Konstante) :) –

5

Zunächst einmal sollten Sie #print_constant in einen included Block setzen:

module Printable 
    extend ActiveSupport::Concern 

    included do 
    private 

    def print_constant 
     puts MY_CONSTANT 
    end 
    end 
end 

Nun gibt es zumindest zwei Möglichkeiten, die Klasse constan Zugriff t MY_CONSTANT:

  1. #included Ausbeuten mit einem base Parameter ähnlich wie Ruby #included:

    module Printable 
        extend ActiveSupport::Concern 
    
        included do |base| 
        private 
    
        define_method :print_constant do 
         puts base::MY_CONSTANT 
        end 
        end 
    end 
    
  2. Eine andere Methode wird von self.class:

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

ActiveSupport Concern Documentation

Verwandte Themen