过滤器在渲染之前但在控制器之后执行?

Chr*_*ris 40 ruby ruby-on-rails ruby-on-rails-3

假设我在基本控制器中有一些逻辑将信息传递给视图以构建类似于痕迹的东西:

class ContextAwareController < ApplicationController

  after_filter :build_breadcrumb

  def build_breadcumb
    #...
  end
end
Run Code Online (Sandbox Code Playgroud)

我想此build_breadcrumb方法运行的主控制器的逻辑,但视图被呈现.

上面的代码运行得太晚了,但是before_filter太早了.

任何人都可以提出一种方法来实现这一点,而无需在子控制器中的每个操作结束时显式调用build_breadcumb吗?

谢谢

Jos*_*eim 53

我遇到了同样的问题并解决了这个问题:

class ApplicationController < ActionController::Base
  def render *args
    add_breadcrumbs
    super
  end
end
Run Code Online (Sandbox Code Playgroud)

  • 但是这个解决方案会减慢每个渲染. (2认同)
  • 它只会减慢特定控制器的渲染速度。将其移动到不同的控制器或“子控制器”将很容易,这样只有需要面包屑的操作才使用此版本的“渲染”。 (2认同)

Pet*_*ich 2

我相信渲染是在调用渲染时开始的,并且没有默认的方法来推迟它。这是你可以做的一件事:

过滤器的应用顺序与声明的顺序相同。因此,创建第二个后置过滤器,使用存储在类变量中的数组 args 调用 render。然后在您通常调用渲染的任何地方设置变量。