我是否必须在Pundit政策中定义所有方法?

时间:2017-08-19 06:35:40

标签: ruby-on-rails pundit

我有一个项目政策,只有超级或管理员才能访问。
它现在看起来像这样:

class ProjectPolicy < ApplicationPolicy

  def index?
    super_or_admin?
  end

  def new?
    super_or_admin?
  end

  def create?
    super_or_admin?
  end

  def update?
    super_or_admin?
  end

  def show?
    super_or_admin?
  end

  def super_or_admin?
    user.role.name == 'superadmin' or user.role.name == 'admin'
  end
end

是否有可能让权威人员自动将super_or_admin?应用于所有路由而不是手动定义每个路由?

1 个答案:

答案 0 :(得分:2)

您可以像这样定义您的政策:

class ProjectPolicy < ApplicationPolicy
  def initialize(user, record)
    raise Pundit::NotAuthorizedError.new(policy: 'project') unless super_or_admin?
  end

  def method_missing(name, *args)
    true
  end

  def super_or_admin?
    user.role.name == 'superadmin' or user.role.name == 'admin'
  end
end

因此它将检查初始化的权限。在这种情况下定义method_missing是必要的,否则您将收到NoMethodError针对特定于操作的方法(create?update?等)。但是你不需要定义它们,因为你检查了initialize方法中的权限,无论如何都要调用它。

然后,如果您需要在所有操作中进行授权,在您的控制器或其祖先中您可以定义:

include Pundit

def authorize_project
  authorize :project
end

并像这样使用before_action回调:

before_action :authorize_project