2014-09-30 8 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

Ваш вопрос был моим ответом. Хотя я согласен с тем, что это не так, ваш вопрос, наконец, дал мне решение, которое по крайней мере сработало. –

ответ

0

Доступ к константе включенного класса из проблемы - это не очень хорошая идея.

Беспокойство не должно быть (слишком много) знание классов он включен в

Я бы для общего API в концерне и переопределять при необходимости ... как это:.

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

У вас будет метод гиперинфляции по порядку (число включенных классов) x (количество методов с использованием константы) :) –

5

Прежде всего, вы должны поставить #print_constant в included блок:

module Printable 
    extend ActiveSupport::Concern 

    included do 
    private 

    def print_constant 
     puts MY_CONSTANT 
    end 
    end 
end 

Теперь есть по крайней мере два способа доступа класса constan т MY_CONSTANT:

  1. #included выходы с параметром base, подобные Руби #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

 Смежные вопросы

  • Нет связанных вопросов^_^