【问题标题】:How to use a default app/policies/application_policy.rb?如何使用默认的 app/policies/application_policy.rb?
【发布时间】:2014-12-17 09:48:03
【问题描述】:

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

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

【问题讨论】:

  • 您找到解决方案了吗?我也有同样的情况,很好奇你的最终方法..

标签: ruby-on-rails pundit


【解决方案1】:

最简单的方法可能是从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。除了最简单的情况或最悲观的默认值(全部为假)外,过于宽松的政策很容易溜走。

【讨论】:

    【解决方案2】:

    我不知道没有为每个模型创建策略的方法,但是您可以创建一个从应用程序策略继承的策略。您的 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
    

    希望这会有所帮助!

    【讨论】:

    • 感谢您的建议。我正在寻找一个真正的默认值,我不必为新类创建策略文件。
    【解决方案3】:

    我使用权威人士 2.1.0

    authorizepolicy_scope 方法使用PolicyFinder 来查找策略类,因此仅当您使用authorizepolicy_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
    

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

    愿它有所帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-08-06
      • 1970-01-01
      • 1970-01-01
      • 2010-11-28
      • 2018-06-17
      • 2012-08-01
      • 2019-02-17
      相关资源
      最近更新 更多