【问题标题】:Why before_filters on subcontrollers are called before the before filters on parent controllers on Rails? [closed]为什么在 Rails 上的父控制器上的 before 过滤器之前调用子控制器上的 before_filters? [关闭]
【发布时间】:2014-02-25 14:30:55
【问题描述】:

我正在使用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_elsedo_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

但他们似乎不是这样称呼的。

那么有什么诀窍呢?

【问题讨论】:

  • 添加评论希望其他人不会像我刚才那样浪费时间进行调试。这种行为(父过滤器之前的子过滤器)仅适用于 Rails 3.x,这就是问题被关闭的原因。从至少 4.2(可能是 4.0)开始,父过滤器被称为 BEFORE 子过滤器。

标签: ruby-on-rails ruby-on-rails-3


【解决方案1】:

改为prependApplicationControllerbefore_filter

class ApplicationController < ActionController::Base
  prepend_before_filter :do_something

  ...
end

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

【讨论】:

    【解决方案2】:

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

    class ApplicationController < ActionController::Base
      prepend_before_filter :do_something
    
      protected
    
      def do_something
      end
    end
    

    【讨论】:

    • 我相信这并不能回答我的问题。如果我在 ApplicationController 上有 5 个 before_filters 在子控制器上有 5 个呢?我该如何定义它们?如果 Sub-controller 被另一个具有 5 个 before_filters 的控制器类进一步子类化怎么办?
    猜你喜欢
    • 1970-01-01
    • 2019-09-07
    • 1970-01-01
    • 2017-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-01
    相关资源
    最近更新 更多