我正在使用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
但他们似乎没有这样称呼。
那么诀窍是什么?
答案 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