2016-02-08 97 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' 

我試過在CatDog型號上使用這種方法included,我有這個結果:

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