CanCanCan gem: load_and_authorize_resource 和控制器的索引操作

CanCanCan gem: load_and_authorize_resource and a controller's index action

class TopicsController < ApplicationController
  load_and_authorize_resource # CanCanCan gem

  def index
    # @topics = Topic.visible_to(current_user)
  end
...
end

据我了解,load_and_authorize_resource 为 CRUD 操作加载了必要的模型实例。这不包括 controller#index 操作(其中实例变量是复数 - 在我的例子中是 @topics)?

这对我不起作用,除非我取消注释我的 index 操作中的行。

如果使用受支持的 ORM(包括 ActiveRecord)并在没有块的情况下定义您的能力,CanCanCan 会为索引操作 starting in version 1.4 加载实例变量。

在以前的版本中,load_and_authorize_resource 仅为那些带有 :id 参数的路由加载单个实例变量,即 CRUD 操作,如您所述。但是,它确实为所有操作授权,但由于它不为索引操作加载实例变量,因此它仅基于模型进行授权。这意味着它会忽略该模型能力中的任何条件。

索引操作

从 1.4 开始,索引操作将使用 accessible_by.

加载集合资源
def index
  # @products automatically set to Product.accessible_by(current_ability)
end

通过https://github.com/ryanb/cancan/wiki/authorizing-controller-actions#load_resource