审计 Gem current_user_method 不工作

Audited Gem current_user_method not working

我在我的应用程序中使用 Audited gem 来跟踪用户日志。除了当前用户跟踪外,一切正常。

就我而言,我有 2 个模型:InstructorStudentInstructor 将是 current_admin_user,我需要手动找到学生。

为了解决这个问题,我尝试覆盖 current_user_method 并在初始化程序中创建一个 audited.rb 文件,内容如下:

Audited.current_user_method = :current_admin_user

这工作正常,但是当我使用任何其他方法时 current_user_or_student ...

Audited.current_user_method = :current_user_or_student

application_controller.rb ...

def current_user_or_student
  current_admin_user || InstructorStudent.find_by_id(id)
end

不进入此方法,甚至current_admin_user也不存储在审计中。

为什么我的 current_user_or_student 方法在 application_controller.rb 中重写时没有被调用?

您已这样定义 current_user_or_student

def current_user_or_student
  current_admin_user || InstructorStudent.find_by_id(id)
end

假设 current_admin_usernil,它将尝试找到 InstructorStudent。如果找不到具有该 ID 的 InstructorStudent,您正在使用 find_by_id,它将 return nil。很可能这就是正在发生的事情。从这个来源中不清楚 id 是什么——您确定它设置为可以在 instructor_students 中找到的 ID 吗?我鼓励您执行以下调试操作:

def current_user_or_student
  current_admin_user || InstructorStudent.find(id)
end

如果方法的条件落入 InstructorStudent.find 分支并且无法找到 id,这将引发错误。如果我的假设是正确的,这将证明无法找到 id,因此您的原始代码是 returning nil(而此更新后的代码现在会出错)。错误消息还将告诉您 id 的值是什么,您可以将其用于进一步调试。

或者,您可以在不更改代码的情况下进行调试,方法是 运行 发送一个您希望审核但未审核的请求,然后检查服务器日志。您将在那里看到查询 运行,并且也可以通过这种方式进行调试。

我终于解决了我的问题,我正在使用 STI(单一 table 继承)。 我的其他讲师控制器不是从应用程序控制器继承的。所以我的 current_user_or_student 没有要求讲师登录。

为了克服这个问题,我创建了一个名为 audited_user.rb

的控制器问题

并写下关注的方法

def current_user_or_student
  current_admin_user || InstructorStudent.find_by_id(id)
end

并将此问题包含在我的讲师基础控制器和应用程序控制器中。 现在一切正常,我的审核用户也正确保存。

我希望这会节省其他任何一天。