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

时间:2015-06-16 08:57:22

标签: ruby-on-rails-4.1 ruby-2.1 cancancan

我的控制器类有两个回调之前,一个来自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的已加载实例变量或者创建自己的set,如果我们为实例变量提供自定义名称会发生​​什么。 (说" @ com = Company.find(params [:id])"而不是" @ company = Company.find(params [:id])")。

抱歉!!!如果问题没有意义,我对rails很新。希望你的答案让我更好地理解这个问题。快乐的编码。

1 个答案:

答案 0 :(得分: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_resourceauthorize_resourceload_resource自动从控制器名称中计算出模型和实例变量名称。因此,在CompaniesController中,它将运行@company ||= Company.find(params[:id]). If you want to customize, you can supply options such as class , instance_name`。

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

,它将覆盖实例变量

以下是有关的两个源文件。它非常易读。来吧,阅读它。你可以更好地了解CanCanCan的内部结构。

controller_additions.rb controller_resource.rb