如何让Pundit将范围应用于与策略名称不同的模型?

时间:2017-01-05 19:02:24

标签: ruby-on-rails pundit

我有一个DirectoryController,并且 - 故意 - 没有UsersController。当我创建管理控件时,无疑会添加UsersController,并且将具有完全不同的范围&目的。

当我在目录控制器中调用policy_scoped时,我想使用DirectoryPolicy中的作用域而不是UserPolicy(它还不存在)。我希望以verify_policy_scoped识别的方式执行此操作,这意味着DirectoryPolicy::Scope.new(current_user, User).resolve的明显工作不仅有点长,而且实际上也不起作用。 (这似乎是一个错误)这似乎是一个明显的疏忽,我确定在某个地方做某些工作,我只是不知道是什么。

我如何在Pundit中做到这一点?

1 个答案:

答案 0 :(得分:1)

当你这样做时

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

您有效地绕过了权威的policy_scoped?跟踪。

我的第一个想法是,如果DirectoryPolicy::Scope旨在确定您的用户数据的范围,那么您可能需要创建Directory模型,因为权威期望。它可以像这个一样简单

class Directory < User; end

现在,当您在DirectoryController

中有这样的内容时
@users = policy_scope(Directory)

pundit可以正确推断您想要DirectoryPolicy::Scope,并且您的resolve方法可以将scope视为User类,因为继承。

如果您不能像我在此处描述的那样继承User,那么您需要显示应用中的一些实际代码,并提供有关Directory是什么以及您是什么的更多背景信息#39;重新尝试用它。