加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – 从模块设置类变量

发布时间:2020-12-17 02:25:31 所属栏目:百科 来源:网络整理
导读:我想为我的应用程序提供单独的日志.我创建了以下模块: 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
我想为我的应用程序提供单独的日志.我创建了以下模块:

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'

我尝试使用Cat和Dog模型中包含的这种方法,我有这样的结果:

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

如果我首先尝试将我的记录器用于Dog模型,我将有一个名为dog(/ dog.log)的日志文件.

如何使用正确的初始化记录器为每个类的模块设置类变量@@ logger?

解决方法

不要使用类变量,使用附加到类的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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读