如何消除这个类变量的使用

时间:2014-07-28 09:08:39

标签: ruby-on-rails ruby postgresql logging

Ruby 2.0.0,Rails 4.0.3,Windows 8.1 Update,PostgreSQL 9.3.3

我已经构建了一个XLog类,允许我从应用程序的任何控制器中将记录写入PostgreSQL。但是,它是围绕使用类变量而构建的。我想知道我是否可以将其转换为实例变量。

在ApplicationController中,我实例化了类变量并编写了第一条记录:

  @@xaction = XLog.new
  @@xaction.info(
      controller: self.class.name,
      action:     "start",
      status:     "success"
  )

在应用程序的任何时候,我都可以使用哈希来引用@@ xaction.info来记录任何事务的成功或失败。它有效......

XLog是:

class XLog < ActiveRecord::Base
  def info hash
    logger.info "XLog " << hash.collect { |key, value| "#{key}: #{value}; "}.join  # map?
    XLog.create(
        controller: hash[:controller],
        associate:  hash[:associate],
        proxy:      hash[:proxy],
        object:     hash[:object],
        value:      hash[:value],
        action:     hash[:action],
        status:     hash[:status],
        message:    hash[:message]
    )
  end
end

2 个答案:

答案 0 :(得分:0)

您可以在类范围中使用实例变量:

class << self

  def xaction
    @xaction ||= XLog.new
  end

end

def xaction
  self.class.xaction
end

xaction.info(
      controller: self.class.name,
      action:     "start",
      status:     "success"
)

如果我拥有正确的Ruby,这应该允许您在控制器方法中以xactionApplicationController.xaction的任何位置访问xaction。


编辑:也许是一个更清洁的解决方案

#app/controllers/application_controller.rb
before_filter :start_log
def start_log
  XLog.info(
      controller: self.class.name,
      action:     "start",
      status:     "success"
  )
end




#app/models/x_log.rb
class XLog < ActiveRecord::Base
  def self.info(hash)
    @logger ||= Xlog.new
    @logger.info hash
  end

  def info(hash)
    logger.info "XLog " << hash.collect { |key, value| "#{key}: #{value}; "}.join  # map?
    XLog.create(
        controller: hash[:controller],
        associate:  hash[:associate],
        proxy:      hash[:proxy],
        object:     hash[:object],
        value:      hash[:value],
        action:     hash[:action],
        status:     hash[:status],
        message:    hash[:message]
    )
  end
end

只需在任何地方使用XLog.info(哈希)即可。如果愿意,可以向应用程序控制器添加一些语法糖。

答案 1 :(得分:0)

在我看来,Xlog应该调用Singleton类:

class Log
  include Singleton

  def info(hash)
    Xlog.create(
        controller: hash[:controller],
        associate:  hash[:associate],
        proxy:      hash[:proxy],
        object:     hash[:object],
        value:      hash[:value],
        action:     hash[:action],
        status:     hash[:status],
        message:    hash[:message]
    )
  end
end

您可以在应用程序控制器around_filter中使用:

 around_filter :wrap_actions

 def wrap_actions
    x_log = Log.instance
    begin
      yield
      x_log.info(hash_success)
    rescue
      x_log.info(hash_fail)
    end
  end