0

我的控制器类有两个之前的回调,一个来自 gem cancancan,另一个来自 rails:

load_and_authorize_resource  
before_action :set_company, only: [:show, :edit, :update, :destroy]  

现在我的问题是:
1)这些回调的顺序是否正确?

2)'load_and_authorize_resource'如何加载实例变量(意味着实例变量的名称是什么?如果我想给实例变量一个自定义名称怎么办?

3)在上面的回调中,第二个是覆盖load_and_authorize_resource加载的实例变量还是创建自己的集合,如果我们为实例变量提供自定义名称会发生​​什么。(比如“@com=Company.find(params[:id])”而不是“@company=Company.find(params[:id])”)。

对不起 !!!如果问题没有意义,我是 Rails 新手。希望你的回答能让我更好地理解这个问题。快乐编码。

4

1 回答 1

1

也许现在是研究宝石内部结构的好时机。CanCanCan(以前的 CanCan)有很多魔力。所以,不看代码很难详细理解。要回答您的问题:

(1)。如果您不添加prepend: true选项,CanCanCan 会将其方法添加为 before_filter(这意味着追加在链的末尾)。before_filters 按照声明的顺序添加。因此,使用您的代码,cancancan 的前置过滤器将在您的 :set_company 之前运行。但是,在这种情况下,不再需要 :set_company 了,因为 CanCanCan 的 load_resource 方法会做同样的事情。

(2)load_and_authorize_resource有两个部分。您也可以单独使用load_resource。自动从控制器名称中找出模型和实例变量名称。因此,在 中,它将运行类instance_name`。authorize_resourceload_resourceCompaniesController@company ||= Company.find(params[:id]). If you want to customize, you can supply options such as,

(3) 这个问题几乎已经回答了。是的,如果您保留 :set_company before_filter,它将覆盖实例变量。

下面是相关的两个源文件。它非常易读。继续阅读它。希望你能更好地理解 CanCanCan 的内部结构。

controller_additions.rb controller_resource.rb

于 2015-07-24T13:19:25.313 回答