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

Dyl*_*arr 20 ruby inheritance ruby-on-rails 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
Run Code Online (Sandbox Code Playgroud)

"B#show"会起作用吗?筛选顺序有哪些规则供将来参考?我在Rails文档中找不到任何相关内容.

dee*_*our 21

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

默认排序应该是

  1. :set_post
  2. :set_user

我认为,如果你想推:set_user到堆栈的顶部,你可以改变线A

prepend_before_action :set_user
Run Code Online (Sandbox Code Playgroud)

另外值得指出的是,这不是关于这个主题的唯一问题; SO上还有其他人.


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


从4.2.6开始(可能在早期版本中有所改变),订单现在是子代之前的父代:

  1. :set_user
  2. :set_post

  • 我刚刚在Rails 4.2上尝试了这个,看起来它已经无效了.首先执行父类的回调,然后执行子类的回调.所以:1)`set_user`,2)`set_post` (6认同)
  • 我编辑了答案以显示更新的功能. (2认同)

kid*_*rew 5

从Rails 4.2.6开始,接受的答案不再正确.它可能早先改变了,但那是我现在的版本.

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

  1. :set_user
  2. :set_post

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