当我创建一个新的脚手架时,我想使用app/policies/application_policy.rb
中提供的默认权威配置。如果不创建一个model_name_policy.rb
,我总会遇到unable to find policy
错误。
当我没有为特定型号设置规则时,如何使用默认值?
答案 0 :(得分:2)
最简单的方法是拯救a.o
引发的Pundit::NotDefinedError
。
根据您的默认政策:
Pundit::PolicyFinder#policy!
假设您在Rails控制器中使用它:
# app/policies/application_policy.rb:
ApplicationPolicy = Struct.new :user, :record do
def index?
true
end
def show?
true
end
# ... other sensible defaults
end
免责声明:我还应说明创建隐式默认策略is generally frowned upon。除了最简单的情况或最悲观的违约(全部都是假的)之外,过度宽松的政策很容易漏掉。
答案 1 :(得分:1)
我不知道为每个模型创建策略的方法,但您可以创建一个继承自您的应用程序策略的策略。您的ApplicationPolicy
可能如下所示:
class ApplicationPolicy
def index?
true
end
def show?
true
end
... More actions ...
end
设置新的脚手架时,只需添加一个继承自您的应用程序策略的空白策略:
class UserPolicy < ApplicationPolicy
end
操作将继承自ApplicationPolicy
。如果需要,您可以始终覆盖默认值:
classUserPolicy < ApplicationPolicy
show?
@user.admin == true ? true : false
end
end
希望这有帮助!
答案 2 :(得分:1)
我使用pundit 2.1.0
authorize
或policy_scope
方法使用PolicyFinder
查找策略类,因此仅当您使用policy
或{{ 1}}做事情。我使用以下方法在应用程序中设置默认策略:
authorize
也许这不是最好的方法(它残酷地修改了原始lib中的方法,并违反了lib的设计),但是对我来说就足够了。
可能有帮助!