在控制器中触发before_action时?

时间:2016-04-06 23:30:07

标签: ruby-on-rails

以下是Rails应用程序中before_action的控制器示例:

class ExampleController < ApplicationController
  include Module1
  before_action :action1

  def controller_method
  ...
  end

  private
  def private_method
  ...
  end
end

Module Module1
  def module_method
   ...
  end   
end

我对before_action的理解是,控制器中controller_method和/或private_method的任何调用和module_method included来自Module1 }将触发before_action action1的执行。这是对的吗?

3 个答案:

答案 0 :(得分:2)

不,不是所有的调用,只是动作(路由调用),通常私有方法不会被调用为动作,因此私有方法不会触发* _action回调。在您的示例中:

class ExampleController < ApplicationController
  include Module1
  before_action :action1

  def controller_method
     // when you call public, protected, or private methods here,
     // the *_action callback will not called
     // becouse it not a call delegated by routes
     private_method 
  end

  private
  def private_method
  ...
  end
end

注意我在controller_method中添加的注释。当你到达像“/ exaple / contoller_method”这样的路由时,将调用contoller_method,在此之前,action1将被称为before_action。但是当你在contoller_method中调用一个方法时,不会为这个内部调用触发before_action。

答案 1 :(得分:1)

Module1中包含的所有方法都将成为ExampleController的一部分,因此它与您在该类中定义这些方法的方法相同。当您调用模块中包含的任何方法时,将首先执行before操作的回调。

答案 2 :(得分:0)

我相信你是对的。无论如何,你也可以定义一个“only”子句。请记住,这只适用于声明的方法。

最好!