我在我的应用程序中使用Audited gem来跟踪用户日志。除了当前用户跟踪之外,一切正常。
就我而言,我有2个模型:using System;
using System.Runtime.InteropServices;
using System.Text;
namespace EdgeApp
{
class Program
{
[DllImport("user32.dll")]
private static extern bool EnumWindows(EnumWindowsProc enumProc, IntPtr lParam);
[DllImport("user32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
private static extern int GetWindowText(IntPtr hWnd, StringBuilder lpString, int nMaxCount);
[DllImport("user32.dll", CharSet = CharSet.Unicode)]
private static extern int GetWindowTextLength(IntPtr hWnd);
[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
private static extern int GetClassName(IntPtr hWnd, StringBuilder lpClassName, int nMaxCount);
[DllImport("user32.dll", ExactSpelling = true, CharSet = CharSet.Auto)]
private static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
public delegate bool EnumWindowsProc(IntPtr hWnd, IntPtr lParam);
public const int SW_HIDE = 0;
public const int SW_SHOWNORMAL = 1;
public const int SW_SHOWMINIMIZED = 2;
public const int SW_SHOWMAXIMIZED = 3;
public static void Main(string[] args)
{
// Enumerate over windows.
EnumWindows((handle, param) =>
{
// Get the class name. We are looking for ApplicationFrameWindow.
var className = new StringBuilder(256);
GetClassName(handle, className, className.Capacity);
// Get the window text. We're looking for Microsoft Edge.
int windowTextSize = GetWindowTextLength(handle);
var windowText = new StringBuilder(windowTextSize + 1);
GetWindowText(handle, windowText, windowText.Capacity);
// Check if we have a match. If we do, minimize that window.
if (className.ToString().Contains("ApplicationFrameWindow") &&
windowText.ToString().Contains("Microsoft Edge"))
{
ShowWindow(handle, SW_SHOWMINIMIZED);
}
// Return true so that we continue enumerating,
// in case there are multiple instances.
return true;
}, IntPtr.Zero);
}
}
}
和Instructor
。 Student
将是Instructor
,我需要手动找到学生。
要解决此问题,我尝试覆盖current_admin_user
并在初始化程序中创建一个audited.rb文件,其中包含以下内容:
current_user_method
这很好用,但是当我使用任何其他方法时,例如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
覆盖时被调用?
答案 0 :(得分:0)
您已定义current_user_or_student
:
def current_user_or_student
current_admin_user || InstructorStudent.find_by_id(id)
end
假设current_admin_user
为nil
,它会尝试查找InstructorStudent
。您使用find_by_id
,如果找不到具有该ID的nil
,则会返回InstructorStudent
。这可能就是发生的事情。从这个来源不清楚id
是什么 - 你确定它被设置为instructor_students
中可以找到的ID吗?我鼓励你做以下调试:
def current_user_or_student
current_admin_user || InstructorStudent.find(id)
end
如果方法的条件属于InstructorStudent.find
分支并且找不到id
,则会引发错误。如果我的假设是正确的,这将证明无法找到id,因此您的原始代码返回nil
(而此更新的代码现在出错了)。错误消息还将告诉您id
的值是什么,您可以将其用于进一步调试。
或者,您可以在不更改代码的情况下通过运行您希望审核但未检查服务器日志的请求来调试此代码。您将看到在那里运行的查询,并且也可以以这种方式进行调试。
答案 1 :(得分:0)
最后我解决了我的问题,我正在使用STI(单表继承)。
我的其他控制器控制器不是从应用程序控制器继承。所以我的current_user_or_student
没有被要求教师登录。
为了解决这个问题,我创建了一个名为audited_user.rb
并撰写关注的方法
def current_user_or_student
current_admin_user || InstructorStudent.find_by_id(id)
end
并在我的讲师基础控制器和应用程序控制器中包含了这个问题。 现在一切正常,我的审计用户也能正确保存。
我希望这会拯救其他任何一天。