2016-02-08 4 views
4

Я хочу иметь отдельные журналы для своего приложения. Я создал следующий модуль:Установить переменную класса из модуля

module MyApp 
    module MyLog 
    def self.included(base) 
     base.extend(ClassMethods) 
    end 

    module ClassMethods 
     def logger 
     @@logger ||= Logger.new("#{Rails.root}/log/#{self.name.underscore}.log") 
     end 
    end 
    end 
end 

Тогда в любой из моих моделей, я могу добавить:

include MyApp::MyLog 

и использовать его в качестве (лог-файл появится в .../log/cat.log):

Cat.logger.info 'test' 

Я попытался использовать этот метод included на моделях Cat и Dog, и у меня есть такой результат:

Cat.new.logger 
# => #<Logger:0x007fe4516cf0b0 @progname=nil, ... @dev=#<File:/.../log/cat.log>, ... 
Dog.new.logger 
# => #<Logger:0x007fe4516cf0b0 @progname=nil, ... @dev=#<File:/.../log/cat.log>, ... (the same) 

Если я пытаюсь использовать мой регистратор для Dog модели первых, у меня будет лог-файл с именем dog (/dog.log).

Как установить переменную класса @@logger из модуля для каждого класса с правильным инициализированным регистратором?

ответ

3

Не используйте переменную класса, используйте instance_variable, который прилагается к классу.

module MyApp 
    module MyLog 

    def self.included(base) 
     base.extend(ClassMethods) 
    end 

    module ClassMethods 
     def logger 
     @logger ||= Logger.new("#{Rails.root}/log/#{self.name.underscore}.log") 
     end 
    end 

    end 
end 

Пример:

module A 
    def self.included(base) 
    base.extend ClassMethods 
    end 

    module ClassMethods 

    def logger 
     puts @logger 
     @logger ||= name 
    end 
    end 
end 

class B 
    include A 
end 

class C 
    include A 
end 

B.logger 
# 
B.logger 
# B 
C.logger 
# 
B.logger 
# B 
C.logger 
# C 

Первый раз, когда вы вызываете метод это nil, таким образом, пустая строка, второй раз при вызове метода значение равно имени класса, B, и при вызове на новый класс снова nil, проверьте также этот ответ

Ruby class instance variable vs. class variable

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