为什么在子控制器上的before_filters在Rails上的父控制器上的before过滤器之前被调用?

p.m*_*los 2 ruby-on-rails ruby-on-rails-3

我在用 Rails 3.2.X

我有Controllers继承案例如下:

class ApplicationController < ActionController::Base
  before_filter :do_something

  protected

  def do_something
  end
end
Run Code Online (Sandbox Code Playgroud)

class ChildController < ApplicationController
  before_filter :do_something_else

  protected

  def do_something_else
  end
end
Run Code Online (Sandbox Code Playgroud)

在调用动作时ChildController我看到do_something_else之前被调用do_something.这是预期的行为吗?

即使我这样做:

append_before_filter :do_something_else
Run Code Online (Sandbox Code Playgroud)

do_something_else始终首先调用,这是不是我的预期.

如何before_filters在子控制器上before_filters定义其父控制器上定义的子控制器之后执行.

[更新]请注意,问题更为笼统.我需要一个答案,它将涵盖任何数量的过滤器ApplicationController和子控制器上的任何数量的过滤器以及更长的继承树上的子控制器的子控制器.

要使此更新更加清晰:

class ApplicationController < ActionController::Base
  before_filter :do_something1
  before_filter :do_something2
end

class ChildController < ApplicationController
  before_filter :do_something3
  before_filter :do_somethign4
end

class Child2Controller < ChildController
  before_filter :do_something5
  before_filter :do_somethign6
end
Run Code Online (Sandbox Code Playgroud)

呼叫操作Child2Controller应该被称为:1)do_something12)do_something23)do_something34)do_something45)do_something56)do_something6

但他们似乎并没有被这样称呼.

那么诀窍是什么?

sea*_*vis 6

相反,尝试prependApplicationController before_filter:

class ApplicationController < ActionController::Base
  prepend_before_filter :do_something

  ...
end
Run Code Online (Sandbox Code Playgroud)

关于这个主题,这个领域还有一些其他问题.这一个解决了这个问题.