Ruby on Rails before_filter vs ruby​​的初始化

时间:2013-09-02 15:01:01

标签: ruby-on-rails ruby

只是想到了我的想法。以下是什么区别

的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
  1. ruby​​的初始化方法是否在rails中按预期工作?
  2. 如果是,那么我们可以使用初始化过滤器必须应用于控制器中的所有操作吗?

2 个答案:

答案 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>

  1. 将过程分解为小方法,并且(在文档中)提醒用户在覆盖方法时使用super
  2. 包括对用户可以使用自定义功能覆盖的各种空挂钩方法的调用。
  3. (我相信这些是Template Method模式的变体。)

    第二种方式需要您付出更多努力,并为您的用户减少工作量。

    在这种特定情况下,before_filter提供了一种更简洁的方法来附加多个钩子,并鼓励您将钩子分解为具有有意义名称的单一责任方法。这在使用更多控制器继承的应用程序中变得更加重要。