控制器中回调之间的混淆?
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_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 的内部结构。
我的控制器 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_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 的内部结构。