首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用默认的app/policy.rb/application_policy.rb?

如何使用默认的app/policy.rb/application_policy.rb?
EN

Stack Overflow用户
提问于 2014-12-17 17:48:04
回答 3查看 930关注 0票数 4

每当我创建一个新的scaffold时,我都想使用app/policies/application_policy.rb中提供的默认pundit配置。如果不创建一个model_name_policy.rb,我总是会收到unable to find policy错误。

当我没有为特定型号设置规则时,如何使用默认值?

EN

回答 3

Stack Overflow用户

发布于 2016-02-05 06:38:01

最简单的方法可能是从Pundit::PolicyFinder#policy!引发的Pundit::NotDefinedError中解救出来。

给定您的默认策略:

代码语言:javascript
复制
# app/policies/application_policy.rb:
ApplicationPolicy = Struct.new :user, :record do
  def index?
    true
  end

  def show?
    true
  end

  # ... other sensible defaults

end

假设您在Rails控制器中使用以下代码:

代码语言:javascript
复制
# 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。除非在最简单的情况下或具有最悲观的默认值(全部为假),否则过度宽松的政策很容易就会漏掉。

票数 2
EN

Stack Overflow用户

发布于 2014-12-30 03:28:08

我不知道有什么方法不为每个模型创建一个策略,但您可以创建一个继承自您的应用程序策略的策略。您的ApplicationPolicy可能如下所示:

代码语言:javascript
复制
class ApplicationPolicy
  def index?
    true
  end

  def show?
    true
  end

  ... More actions ...
end

在设置新的scaffold时,只需添加一个继承自您的应用程序策略的空白策略:

代码语言:javascript
复制
class UserPolicy < ApplicationPolicy

end

这些操作将从ApplicationPolicy继承。如果需要,您可以随时覆盖默认值:

代码语言:javascript
复制
classUserPolicy < ApplicationPolicy
  show?
    @user.admin == true ? true : false
  end
end

希望这能有所帮助!

票数 1
EN

Stack Overflow用户

发布于 2020-08-05 10:17:44

我使用的是pundit 2.1.0

authorizepolicy_scope方法使用PolicyFinder查找策略类,因此只有在使用authorizepolicy_scope执行此操作时,才覆盖policy方法是无用的。我使用以下方法在我的应用程序中设置默认策略:

代码语言:javascript
复制
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

也许这不是最好的方法(它粗暴地修改了原始库中的方法,违反了库的设计),但对我来说已经足够了。

希望它能帮上忙!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27522622

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档