【问题标题】:What order do before filters occur in?过滤器出现之前的顺序是什么?
【发布时间】:2013-09-06 02:30:48
【问题描述】:

过滤器出现之前的顺序是什么?具体来说,在继承方面, before_action 过滤器的出现顺序是什么?例如,这是否可行:

class A < ActionController::Base
  before_action :set_user

  def set_user
    @user = something
  end
end

class B < A
  before_action :set_post

  def show
    render @post
  end

  def set_post
    @post = @user.posts.first
  end
end

B#show 会起作用吗?过滤顺序的规则是什么,以供将来参考?我在 Rails 文档中找不到任何这些内容。

【问题讨论】:

  • 你的 A 类没有继承自 ActionController 之类的控制器吗?如果对B 实例执行操作,则会首先调用像set_user 这样的继承过滤器。
  • 很抱歉。修好了。

标签: ruby-on-rails ruby inheritance before-filter


【解决方案1】:

我建议查看过滤器上的 the source codeAPI Docs

默认排序应该是

  1. :set_post
  2. :set_user

我认为如果您想将:set_user 推到堆栈顶部,您可以将A 中的行更改为

prepend_before_action :set_user

同样值得指出的是,这不是该主题的唯一问题;有others here on SO


至于您的具体情况,您似乎需要更改 A,就像我上面提到的那样,以便在 set_postB 运行时分配 @user


从 4.2.6 开始(可能在早期版本中进行了更改),现在的顺序是先父后子:

  1. :set_user
  2. :set_post

【讨论】:

  • 谢谢。这就是我所需要的。
  • 您的默认排序(上图)向后。派生类 (B) 上的 before_filters 在基类 (A) before_filters 之前调用。所以它是: 1. :set_user 和 2. :set_post 还要注意,after_filters 以相反的顺序调用,最先派生的。
  • 我刚刚在 Rails 4.2 上试过这个,看起来这不再有效了。先执行父类的回调,再执行子类的回调。所以:1)set_user,2)set_post
  • 如果您建议直接对答案进行编辑,那就太好了。
【解决方案2】:

从 Rails 4.2.6 开始,接受的答案不再正确。可能之前改过,但我现在是这个版本。

现在在子过滤器之前调用父过滤器,因此现在的顺序是:

  1. :set_user
  2. :set_post

而且,如果你仔细想想,这种排序真的更有意义。如前所述,如果需要child在parent之前调用filter,则需要使用prepend_before_action

【讨论】:

    【解决方案3】:

    是的,您的代码将按预期工作。

    派生类 (B) 上的 before_filters 在基类 (A) 上的 before_filters 之前调用。所以调用方法的顺序是:

    1. set_user()
    2. set_post()
    3. 显示()

    另请注意,after_filters 以相反的顺序调用,派生最多的在前。

    【讨论】:

    • 如你所说,先调用派生类中的before_filter,因为B是派生类,所以先调用set_post,再调用set_user。
    猜你喜欢
    • 2020-07-10
    • 2011-12-17
    • 1970-01-01
    • 1970-01-01
    • 2021-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-27
    相关资源
    最近更新 更多