2011-06-23 36 views
2

我正在嘗試在我的RoR應用程序上創建一個記錄功能,該功能記錄用戶在模型中的給定控制器上執行的所有操作。我試着用過濾器來實現它,但是他們沒有解決我的問題,因爲他們不允許我正確地記錄「創建」操作。如何記錄創建操作?

「創建」操作很棘手,因爲當前/後過濾器被調用時,操作尚未保存,因此,我沒有模型的相應ID(我需要)。

我知道我可以使用「after_commit」,但這會大大增加日誌記錄功能的複雜性,因爲保存在每個日誌條目中的「參數」暴露給控制器,但不暴露給模型。

有沒有辦法動態地將「after_commit」過濾器添加到ActiveRecord的實例?

回答

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(模型)的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日誌目錄下創建文件。希望它應該能夠登錄。我知道它不是最好的解決方案,而且我有更好的方法去做,但是當時我需要緊急工作,所以我堅持下去。

結帳這些鏈接:
rails logging tips
alternative logging solution