2011-06-23 14 views
2

モデルの特定のコントローラでユーザーが実行したすべてのアクションをログに記録する、RoRアプリケーションでログ機能を作成しようとしています。フィルターで実装しようとしましたが、「作成」アクションを正しくログに記録できないため、問題を解決できませんでした。作成アクションを記録するにはどうすればよいですか?

「作成」アクションは、before/afterフィルタが呼び出されたときにアクションがまだ保存されていないため、扱いにくいため、モデルの対応するID(必要なもの)がありません。

私は "after_commit"を使うことができますが、各ログエントリに保存された "parameters"はコントローラには公開されていますが、モデルには公開されていないため、

ActiveRecordのインスタンスに「after_commit」フィルタを動的に追加する方法はありますか?

答えて

0

がこれを読んで、私はこれは素晴らしい解決策だと思う:Notifications

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 

のThコントローラ(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

関連する問題