【问题标题】:PaperTrail: how to differentiate whodunnit when we track changes by both Users *and* AdminUsers?PaperTrail:当我们同时跟踪用户 * 和 * AdminUsers 的更改时,如何区分 whodunnit?
【发布时间】:2017-03-20 19:58:22
【问题描述】:

我们模型的 whodunnit 值是一个字符串 - 例如 "22"User 中的 id22

问题是我们同时使用UserAdminUser 模型来跟踪whodunnit。因此,无法判断更改是由用户还是由 AdminUser 进行的:

def user_for_paper_trail
  current_user || current_admin_user
end

我对 PaperTrail 有点陌生,但我通过他们的文档进行了研究,但无法提出任何解决方案。这可能是一个奇怪的请求,但我喜欢像任意字段这样的东西,如果这有意义的话,我们可以为 whodunnit type 添加一个值。或者一种仅根据控制器跟踪某些更改的方法(在这种情况下可以使用,因为我只跟踪通过 AdminPanel 进行的更改)。

感谢您的任何建议或指导。

【问题讨论】:

  • 使用统一的User 模型按角色区分管理员不是一种选择吗?

标签: ruby-on-rails paper-trail-gem


【解决方案1】:

PaperTrail 存储 id 是因为以下两个原因之一:

  • 使用 PaperTrail 提供的默认 before_action 分配 Whodunnit,并在 your user_for_paper_trail 方法返回的值上调用 .id

  • 您的应用根据您的 user_for_paper_trail 方法的结果手动调用 .id

由于UserAdminUser ids 不是普遍唯一的,您应该存储不同的值。

whodunnit 值可以是您决定的任何字符串。如果您有一个可用于区分 UsersAdminUsers 的唯一标识符,则应存储该值。

我认为以下选项之一可能会解决您的问题:

  1. 如果 email 在两个用户模型之间是唯一的,则存储电子邮件而不是 id。

  2. 如果 email 不是唯一的,您可以存储一个同时显示用户模型类型和 id 的字符串(例如 'User: 1' 和/或 'AdminUser: 1'),然后当您获取987654338@ 值,您可以解析用户模型和 id 的字符串,然后根据需要使用该信息。

  3. 阅读PaperTrail details how to find out who was responsible for a change 的方法并提出类似的自定义解决方案(或another option)。

【讨论】:

  • 谢谢@ecnalyr。我觉得 #2 符合我的期望,但我在您链接的文档中没有看到任何相关内容(我今天早些时候读过它们 - 也许我错过了)。
  • 对于未来的探索者:依靠上面的解决方案,我决定在模型的管理面板中添加一个before_filter。在其中我将whodunnit 的值设置为:PaperTrail.whodunnit = "AdminUser: #{current_admin_user.id}"
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-13
  • 1970-01-01
相关资源
最近更新 更多