过滤器出现之前的顺序是什么?

时间:2013-09-03 00:27:59

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

过滤器出现之前的顺序是什么?具体来说,关于inheiritance,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文档中找不到任何相关内容。

3 个答案:

答案 0 :(得分:21)

我建议您在过滤器上查看 the source code API Docs

默认排序应为

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

    prepend_before_action :set_user
    

    另外值得指出的是,这不是关于该主题的唯一问题;有others here on SO


    根据您的具体情况,您似乎需要更改A,如上所述,以便@user在{{1} set_post之前分配B跑。


    从4.2.6开始(可能在早期版本中已更改),现在订购在child之前是父级:

    1. :set_user
    2. :set_post

答案 1 :(得分:5)

从Rails 4.2.6开始,接受的答案不再适用。它可能早些时候已经改变了,但那是我现在的版本。

现在在子过滤器之前调用父过滤器,因此现在排序为:

  1. :set_user
  2. :set_post
  3. 而且,如果你考虑一下,那个顺序真的更有意义。如前所述,如果您需要孩子在父母之前调用过滤器,则需要使用prepend_before_action

答案 2 :(得分:0)

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

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

  1. set_user()
  2. set_post()
  3. 显示()
  4. 另请注意,after_filters以相反顺序调用,最先导出。