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

时间:2014-02-25 14:30:55

标签: 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

class ChildController < ApplicationController
  before_filter :do_something_else

  protected

  def do_something_else
  end
end

ChildController上调用操作时,我会在do_something_else之前调用do_something。这是预期的行为吗?

即使我这样做:

append_before_filter :do_something_else
总是先调用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
应调用Child2Controller上的呼叫操作:1)do_something1 2)do_something2 3)do_something3 4)do_something4 5)do_something5 6)do_something6

但他们似乎没有这样称呼。

那么诀窍是什么?

2 个答案:

答案 0 :(得分:6)

相反,请尝试prepend ApplicationController before_filter

class ApplicationController < ActionController::Base prepend_before_filter :do_something ... end
{{1}}

此主题还有一些关于此主题的其他问题。 This one解决了这个问题。

答案 1 :(得分:0)

如果您希望首先执行该方法,请使用prepend_before_filter作为ApplicationController中的方法。

class ApplicationController < ActionController::Base
  prepend_before_filter :do_something

  protected

  def do_something
  end
end