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
相关产品推荐
相关产品推荐

