如何理解cancancan gem的load_resource和authorize_resource方法?

时间:2016-03-18 03:16:47

标签: ruby-on-rails ruby cancancan

我在我的rails应用程序中使用cancancan gem。但我对load_and_authorize_resource方法的含义并不十分清楚。我知道这与调用load_resourceauthorize_resource相同。

load_resource将创建模型的新实例,或者通过params[:id]或实例集合获取实例,然后authorize_resource方法将使用这些实例进行授权。但是,如果我在每个控制器操作中已经有Model.find(params[:id])Model.new,那么我需要添加load_resource方法?

对于某些操作(非RESTful操作),他们与模型没有关系,所以我不需要获取实例,对于这种情况,authorize_resource如何正常工作?

任何想法都很感激!提前谢谢!

1 个答案:

答案 0 :(得分:2)

load_and_authorize_resource为每个操作设置before_filter,以将资源加载到实例变量中并自动进行授权。因此,这对RESTful操作很有用。现在,如果您在同一个控制器中有非RESTful操作,无法加载资源,您可以执行以下操作:

load_and_authorize_resource only: [:index, :show]

OR

skip_load_resource only: :new

这将跳过before_filter这些操作。

如果你在控制器中有Model.find(params[:id]),你可以删除它或只使用:

authorize_resource

这些操作不需要load_resourceload_resource也与您手动完成的操作相同。它只是为所有操作添加before_action,并根据id找到对象。

并且load_resource将始终为您提供具有相同名称Model的实例变量,因此如果您在视图中使用不同的对象,那么它也不会有帮助。因此,选择一个选项取决于您和您的代码。

Cancancan Wiki:

  

从CanCan 1.5开始,您可以使用skip_load_and_authorize_resourceskip_load_resourceskip_authorize_resource方法跳过任何应用的行为,并指定特定的操作,例如在过滤器之前。

希望这有帮助。