我的控制器类有两个回调之前,一个来自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很新。希望你的答案让我更好地理解这个问题。快乐的编码。
答案 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_resource
和authorize_resource
。 load_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的内部结构。