You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Audited gem自定义current_user_method方法无法调用问题咨询

解决Audited Gem自定义current_user_method不生效的问题

看起来你遇到的核心问题是配置时机不对,加上方法里的小bug导致的。我来帮你一步步拆解原因和解决方案:

首先,为什么在application_controller.rb里设置的方法没被调用?
Audited的全局配置是在Rails启动阶段(也就是initializer加载时)完成初始化的。你先在initializers/audited.rb里设置了:current_admin_user,之后在application_controller.rb里再修改current_user_method时,Audited已经完成了回调绑定,不会再读取新的配置值了——相当于你的第二次设置“迟到”了,根本没被Audited感知到。

另外你原方法里的InstructorStudent.find_by_id(id)还有个小问题:这里的id变量是未定义的,就算方法被调用也会直接报错,这也是后续需要修正的点。

下面是具体的修复步骤:


1. 统一Audited配置到Initializer

把自定义的current_user_method配置放在Rails启动时加载的initializer里,确保Audited一开始就知道要调用哪个方法。

修改config/initializers/audited.rb:

# 如果你用的是Audited v5+,推荐用configure块
Audited.configure do |config|
  config.current_user_method = :current_user_or_student
end

# 旧版本Audited(v4及以下)可以直接赋值
# Audited.current_user_method = :current_user_or_student

2. 在ApplicationController中正确定义方法

确保方法能正确获取到当前的Instructor或Student,同时修正变量未定义的问题:

class ApplicationController < ActionController::Base
  def current_user_or_student
    # 优先取当前登录的Instructor(对应current_admin_user)
    current_admin_user || find_current_student
  end

  private

  def find_current_student
    # 这里根据你的业务逻辑调整:比如从请求参数、session或认证token里取Student
    # 示例1:如果请求里带student_id参数
    Student.find_by(id: params[:student_id])
    # 示例2:如果Student是通过session登录的
    # Student.find_by(id: session[:student_id])
  end
end

3. 验证配置是否生效

你可以在某个控制器的动作里手动触发审计,检查结果:

class CoursesController < ApplicationController
  def update
    @course = Course.find(params[:id])
    @course.update!(params.permit(:name, :description))
    # 打印最后一条审计记录的用户,确认是否正确
    puts "审计用户:#{@course.audits.last.user.inspect}"
  end
end

额外排查点

  • 确保所有需要审计的控制器都继承自ApplicationController,这样current_user_or_student方法才能被Audited访问到;
  • 检查是否有其他initializer或控制器代码覆盖了Audited.current_user_method的设置;
  • 确认current_admin_user能正常返回当前登录的Instructor(比如用Devise的话,检查路由和认证配置是否正确)。

内容的提问来源于stack exchange,提问作者Vishal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:25:39