21

过滤器出现之前的顺序是什么?具体来说,就继承而言, 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 文档中找不到任何这些。

4

3 回答 3

25

我建议查看过滤器的源代码API 文档

默认排序应该是

  1. :set_post
  2. :set_user

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

prepend_before_action :set_user

同样值得指出的是,这不是该主题的唯一问题。SO 上还有其他人。


至于你的具体情况,看起来你需要A像我上面提到的那样进行更改,以便在运行@user时被分配。set_postB


从 4.2.6 开始(可能在早期版本中发生了变化),现在的顺序是先父后子:

  1. :set_user
  2. :set_post
于 2013-09-03T01:04:24.687 回答
8

从 Rails 4.2.6 开始,接受的答案不再正确。它可能早先已更改,但这是我现在使用的版本。

父过滤器现在在子过滤器之前被调用,所以现在的顺序是:

  1. :set_user
  2. :set_post

而且,如果你仔细想想,这种排序真的更有意义。如前所述,如果需要子级在父级之前调用过滤器,则需要使用prepend_before_action.

于 2016-07-14T15:21:55.013 回答
0

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

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

  1. 设置用户()
  2. set_post()
  3. 节目()

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

于 2014-04-25T19:33:54.880 回答