【问题标题】:How to get Pundit to apply a scope to a model with a different name than the policy?如何让 Pundit 将范围应用于名称与策略不同的模型?
【发布时间】:2017-01-05 19:02:23
【问题描述】:

我有一个 DirectoryController,并且 - 故意 - 没有 UsersController。当我创建管理控件时,用户控制器无疑会被添加,并且会有完全不同的范围和目的。

当我在目录控制器中调用 policy_scoped 时,我想使用 DirectoryPolicy 中的范围,而不是 UserPolicy(尚不存在)。我想以verify_policy_scoped 认可的方式来做这件事,这意味着DirectoryPolicy::Scope.new(current_user, User).resolve 的明显解决方法不仅有点长,而且实际上也不起作用。 (这似乎是一个错误)这似乎是一个明显的疏忽,我确信在某个地方有什么东西可以让这个工作,我只是不知道是什么。

如何在 Pundit 中执行此操作?

【问题讨论】:

  • 策略与模型耦合。因此,您通常为每个模型创建一个策略类。在你的情况下,现在而不是以后创建一个 UserPolicy 类是有意义的。

标签: ruby-on-rails pundit


【解决方案1】:

当你这样做时

DirectoryPolicy::Scope.new(current_user, User).resolve

您实际上绕过了权威人士的 policy_scoped? 跟踪。

我的第一个想法是,如果 DirectoryPolicy::Scope 旨在确定您的用户数据范围,那么您可能需要按照权威人士的预期创建一个 Directory 模型。就这么简单

class Directory < User; end

现在,当您的 DirectoryController 中有类似内容时

@users = policy_scope(Directory)

权威人士可以正确推断出您需要DirectoryPolicy::Scope,并且您的resolve 方法可以将scope 视为User 类,因为它具有继承性。

如果您不能像我在这里描述的那样子类化User,您将需要显示您的应用程序中的一些实际代码,并提供更多关于Directory 是什么以及您试图用它做什么的上下文。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-04
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多