2014-09-30 5 views
6

Qual è il modo più semplice per accedere alla costante protetta della classe inclusa nel contesto ActiveSupport :: Concern?Accesso alla costante protetta della classe inclusa in un ActiveSupport :: Concern

classi Esempio:

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 

Questa soluzione produce un errore:

NameError: uninitialized constant Printable::MY_CONSTANT 

Sono consapevole di un'alternativa che sembra funzionare:

puts self.class::MY_CONSTANT 

Ma, doesn non mi sembra giusto :-)

Qualche suggerimento migliore?

+2

La tua domanda è stata la mia risposta. Mentre sono d'accordo sul fatto che non mi sembra giusto, alla fine la tua domanda mi ha dato una soluzione che almeno ha funzionato. –

risposta

0

L'accesso a una costante di una classe inclusa da una preoccupazione non è davvero una buona idea.

Una preoccupazione non dovrebbe avere (troppo) la conoscenza delle classi è inclusa nel

vorrei andare per un'API comune nella preoccupazione e ignorare quando necessario ... in questo modo:.

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

Avrai un metodo iperinflazione nell'ordine di (numero di classi incluse) x (numero di metodi che usano la costante) :) –

5

Prima di tutto, si dovrebbe mettere #print_constant in un included blocco:

module Printable 
    extend ActiveSupport::Concern 

    included do 
    private 

    def print_constant 
     puts MY_CONSTANT 
    end 
    end 
end 

Ora ci sono almeno due modi di accesso alla classe di Constan t MY_CONSTANT:

  1. #included rese con un parametro base simili a Ruby #included:

    module Printable 
        extend ActiveSupport::Concern 
    
        included do |base| 
        private 
    
        define_method :print_constant do 
         puts base::MY_CONSTANT 
        end 
        end 
    end 
    
  2. altro metodo sta andando da self.class:

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

ActiveSupport Concern Documentation

Problemi correlati