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

时间:2014-12-17 09:48:04

标签: ruby-on-rails pundit

当我创建一个新的脚手架时,我想使用app/policies/application_policy.rb中提供的默认权威配置。如果不创建一个model_name_policy.rb,我总会遇到unable to find policy错误。

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

3 个答案:

答案 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

authorizepolicy_scope方法使用PolicyFinder查找策略类,因此仅当您使用policy或{{ 1}}做事情。我使用以下方法在应用程序中设置默认策略:

authorize

也许这不是最好的方法(它残酷地修改了原始lib中的方法,并违反了lib的设计),但是对我来说就足够了。

可能有帮助!