只是想到了我的想法。以下是什么区别
的before_filter
class ApplicationController < ActionController::Base
before_filter :foo
def foo
@mode = Model.new
end
end
ruby初始化
class ApplicationController < ActionController::Base
def initialize
foo
end
def foo
@mode = Model.new
end
end
答案 0 :(得分:23)
对于每个请求,您确实获得了ApplicationController
的新实例,但是这里的重要禁忌是您试图在不调用父行为的情况下覆盖ActionController::Base#initialize
的核心行为。 / p>
ApplicationController < ActionController::Base
def initialize
super # this calls ActionController::Base initialize
init_foo
end
private
def init_foo
@foo = Foo.new
end
end
这不是惯用的Rails行为。他们出于某种原因给你before_filter
;所以使用它。
答案 1 :(得分:3)
我相信Sandi Metz在Practical Object-Oriented Design in Ruby中介绍了这一点。
假设您正在为其他开发人员/用户设计基类,并希望允许他们挂钩过程中的各个步骤(例如初始化。)通常,有两种方法:< / p>
super
。(我相信这些是Template Method模式的变体。)
第二种方式需要您付出更多努力,并为您的用户减少工作量。
在这种特定情况下,before_filter
提供了一种更简洁的方法来附加多个钩子,并鼓励您将钩子分解为具有有意义名称的单一责任方法。这在使用更多控制器继承的应用程序中变得更加重要。