每当我创建一个新的scaffold时,我都想使用app/policies/application_policy.rb中提供的默认pundit配置。如果不创建一个model_name_policy.rb,我总是会收到unable to find policy错误。
当我没有为特定型号设置规则时,如何使用默认值?
发布于 2016-02-05 06:38:01
最简单的方法可能是从Pundit::PolicyFinder#policy!引发的Pundit::NotDefinedError中解救出来。
给定您的默认策略:
# app/policies/application_policy.rb:
ApplicationPolicy = Struct.new :user, :record do
def index?
true
end
def show?
true
end
# ... other sensible defaults
end假设您在Rails控制器中使用以下代码:
# app/controllers/application_controller.rb:
class ApplicationController
include Pundit
# ...
private
def policy(record)
super
rescue Pundit::NotDefinedError
ApplicationPolicy.new pundit_user, record
end
end免责声明:我还应该声明创建隐式默认策略is generally frowned upon。除非在最简单的情况下或具有最悲观的默认值(全部为假),否则过度宽松的政策很容易就会漏掉。
发布于 2014-12-30 03:28:08
我不知道有什么方法不为每个模型创建一个策略,但您可以创建一个继承自您的应用程序策略的策略。您的ApplicationPolicy可能如下所示:
class ApplicationPolicy
def index?
true
end
def show?
true
end
... More actions ...
end在设置新的scaffold时,只需添加一个继承自您的应用程序策略的空白策略:
class UserPolicy < ApplicationPolicy
end这些操作将从ApplicationPolicy继承。如果需要,您可以随时覆盖默认值:
classUserPolicy < ApplicationPolicy
show?
@user.admin == true ? true : false
end
end希望这能有所帮助!
发布于 2020-08-05 10:17:44
我使用的是pundit 2.1.0
authorize或policy_scope方法使用PolicyFinder查找策略类,因此只有在使用authorize或policy_scope执行此操作时,才覆盖policy方法是无用的。我使用以下方法在我的应用程序中设置默认策略:
Pundit::PolicyFinder.class_eval do
def policy
klass = find(object)
(klass.is_a?(String) ? klass.safe_constantize : klass) || DefaultPolicy # set a default policy
end
end也许这不是最好的方法(它粗暴地修改了原始库中的方法,违反了库的设计),但对我来说已经足够了。
希望它能帮上忙!
https://stackoverflow.com/questions/27522622
复制相似问题