控制器中回调之间的混淆?

Confusion between callbacks in controller?

我的控制器 class 有两个之前的回调,一个来自 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 的新手。希望你的回答能让我更好地理解这个问题。快乐编码。

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

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

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

(3) 这个问题几乎已经有答案了。是的,如果您保留 :set_company before_filter.

它将覆盖实例变量

下面是相关的两个源文件。它的可读性很强。继续阅读吧。希望您能更好地理解 CanCanCan 的内部结构。

controller_additions.rb controller_resource.rb