审计 Gem current_user_method 不工作
Audited Gem current_user_method not working
我在我的应用程序中使用 Audited gem 来跟踪用户日志。除了当前用户跟踪外,一切正常。
就我而言,我有 2 个模型:Instructor
和 Student
。 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
中重写时没有被调用?
您已这样定义 current_user_or_student
:
def current_user_or_student
current_admin_user || InstructorStudent.find_by_id(id)
end
假设 current_admin_user
是 nil
,它将尝试找到 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
并将此问题包含在我的讲师基础控制器和应用程序控制器中。
现在一切正常,我的审核用户也正确保存。
我希望这会节省其他任何一天。
我在我的应用程序中使用 Audited gem 来跟踪用户日志。除了当前用户跟踪外,一切正常。
就我而言,我有 2 个模型:Instructor
和 Student
。 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
中重写时没有被调用?
您已这样定义 current_user_or_student
:
def current_user_or_student
current_admin_user || InstructorStudent.find_by_id(id)
end
假设 current_admin_user
是 nil
,它将尝试找到 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
并将此问题包含在我的讲师基础控制器和应用程序控制器中。 现在一切正常,我的审核用户也正确保存。
我希望这会节省其他任何一天。