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
答案 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,这应该允许您在控制器方法中以xaction
或ApplicationController.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