【rails・devise】ユーザーの操作履歴を表示する方法

【rails・devise】ユーザーの操作履歴を表示する方法

結論と実装のイメージ

  •  ユーザーに紐づく操作履歴用のモデルを用意する
    • 操作履歴を残しておくテーブルを作成する
  • 操作履歴を残したいcontrollerのアクションに、それぞれ操作履歴を作成するメソッドを仕込む
    • 例えばusers_controllerのcreateアクションの中に、操作履歴保存用のメソッドを仕込む
    • createアクションが実行されたら、操作履歴も一緒に保存される

実装内容

まずは履歴を保存する用のモデル、テーブルを作成します。

terminal
$ rails g model SystemOperationLog user_id:integer message:string

UserモデルとSystemOperationLogモデルは1対多の関係になるので、関連づけを記載します。

models/user.rb
class User < ApplicationRecord
  has_many :system_operation_logs, dependent: :destroy
end
models/system_operation_log.rb
class SystemOperationLog < ApplicationRecord
  belongs_to :user, optional: true
end

続いて、モデルに履歴保存用のクラスメソッドを作成します。

models/system_operation_log.rb
class SystemOperationLog < ApplicationRecord
  belongs_to :user, optional: true

  def self.create_log(user_id, message)
    SystemOperationLog.create(user_id: user_id, message: message)
  end
end

後は、履歴を取りたいところに、クラスメソッドを仕込みます。今回はuserのcreateアクションに入れてみます。

controllers/users_controller.rb
  def create
    @user = User.new(user_params)

    respond_to do |format|
      if @user.save
        SystemOperationLog.create_log(current_admin.id, "#{current_admin.name}が#{@user.name}を作成しました")
        format.html { redirect_to @user, notice: "#{@user.name}を作成しました" }
        format.json { render :show, status: :created, location: @user }
      else
        format.html { render :new, status: :unprocessable_entity }
        format.json { render json: @user.errors, status: :unprocessable_entity }
      end
    end
  end

after_actionとかを使うと、いろんなところに一気にログを仕込めそうですが、どうなのかなとか思っています。
今回は、以上です。

Leave a Reply

Your email address will not be published.

CAPTCHA