8

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

就我而言,我有 2 个模型:InstructorStudent. Instructor将是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

4

2 回答 2

2

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

为了克服这个问题,我创建了一个控制器关注点,称为audited_user.rb

并写下关注的方法

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

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

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

于 2018-01-12T04:07:25.223 回答
0

您已这样定义current_user_or_student

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

假设current_admin_usernil,它会尝试查找InstructorStudent。如果找不到具有该 ID的,您正在使用find_by_idwhich 将返回。这很可能就是正在发生的事情。从这个来源不清楚什么是 - 你确定它设置为可以在 中找到的 id吗?我鼓励你做以下调试:nilInstructorStudentidinstructor_students

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

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

或者,您可以在不更改代码的情况下进行调试,方法是运行您希望被审计但没有被审计的请求,然后检查服务器日志。您将看到查询在那里运行,并且可能也能够以这种方式进行调试。

于 2018-01-09T15:16:43.710 回答