【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とかを使うと、いろんなところに一気にログを仕込めそうですが、どうなのかなとか思っています。
今回は、以上です。