Rails5、权威授权

Rails 5, pundit authorization

Pundit 运作良好,如果操作具有以下资源:

class Admin::PagesController << ApplicationController
  def index
    @pages = Page.all
  end
end

如何在没有任何资源的情况下授权方法?

class Admin::DashboardController << ApplicationController
  def index
  end
end

我有文件 policies/admin/dashboard_policy.rb

class Admin::DashboardPolicy < ApplicationPolicy
  class Scope < Scope
    def resolve
      scope.all
    end
  end
end

此文件由命令生成:

rails g pundit:policy Admin/Dashboard

文件 views/admin/index.html.slim 只有静态文本。仅此而已。

如何在没有任何资源的情况下授权操作?

问候 Sssebaaa

如果您没有任何回调来检查政策是否在范围内,正如专家文档所建议的那样,例如

class ApplictationController < ActionController::Base
  include Pundit
  after_action :verify_policy_scoped, only: :index
end

你无事可做。

但是,如果您确实有回调,则可以像这样在控制器操作中跳过它:

class Admin::DashboardController << ApplicationController
  skip_after_action :verify_policy_scoped, only: [:index]

  def index 
  end
end

要在没有范围或模型实例的情况下进行授权,请使用符号或符号数组(命名空间时)调用授权:

class Admin::DashboardController << ApplicationController
  def index
    authorize [:admin, :dashboard]
  end
end

这将在策略 class:

上调用 #index? 方法
class Admin::DashboardPolicy < ApplicationPolicy
  def index?
    user.admin?
  end
end

您也可以从策略中完全删除范围。