我正在尝试在我的RoR应用程序上创建一个日志记录功能,记录用户在模型中给定控制器上执行的所有操作。我尝试使用过滤器实现它,但它们没有解决我的问题,因为它们不允许我正确记录“创建”操作。
“创建”操作很棘手,因为当调用前/后过滤器时操作尚未保存,因此,我没有相应的模型ID(我需要)。
我知道我可以使用“after_commit”,但这会大大增加日志记录功能的复杂性,因为每个日志条目中保存的“参数”都会暴露给控制器,而不会暴露给模型。
有没有办法动态地将“after_commit”过滤器添加到ActiveRecord的实例?
答案 0 :(得分:0)
阅读本文,我认为这是一个很好的解决方案:Notifications
答案 1 :(得分:0)
这就是我记录的方式,我有一个用户控制器创建这样的动作:
def create
@user = User.new(params[:user])
if @user.save
flash[:notice] = "Welcome, #{@user.username}"
redirect_to(:controller => "users", :action => "home")
session[:id] = @user.id
else
render("home")
end
end
现在我想记录用户的创建,然后我这样做:
首先在User.rb(model)中创建一个AuditLogger类:
class User < ActiveRecord::Base
...some stuff other....
class AuditLogger < Logger
def format_message(severity, timestamp, progname, msg)
"#{timestamp.to_formatted_s(:db)} #{severity} #{msg}\n"
end
end
然后回到控制器(users.rb)
def create
@user = User.new(params[:user])
if @user.save
logfile = File.open("#{Rails.root}/log/my_log.log", 'a')
audit_log = AuditLogger.new(logfile)
audit_log.info "#{@user.firstname} was created successfully"
redirect_to(:controller => "users", :action => "home")
else
render("home")
end
end
此外,您还需要在日志目录中创建名为my_log.log的文件。希望它应该能够记录。我知道它不是最好的解决方案,而且我有更好的方法,但当时我需要紧急工作,所以我坚持下去。