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