filter出现之前的顺序是什么?
filter出现之前的顺序是什么? 具体来说,关于inheiritance,before_actionfilter出现了什么顺序? 例如,这会工作:
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文档中找不到任何这些内容。
我建议您查看filter上的源代码和API文档 。
默认排序应该是
-
:set_post
-
:set_user
我想如果你想将:set_user
推送到堆栈的顶部,你可以将A
的行改为
prepend_before_action :set_user
另外值得指出的是,这不是关于该主题的唯一问题; SO上还有其他人 。
至于您的具体情况,看起来您需要更改A
,如上所述,以便在B
运行时通过@user
分配set_post
。
从4.2.6开始(可能在早期版本中有所改变),现在订购在child之前为parent:
-
:set_user
-
:set_post
从Rails 4.2.6开始,接受的答案已不再适用。 它可能早先改变了,但那是我现在的版本。
现在在子filter之前调用父filter,因此现在排序为:
-
:set_user
-
:set_post
并且,如果你考虑一下,那个顺序真的更有意义。 如前所述,如果您需要子prepend_before_action
在父prepend_before_action
之前调用filter,则需要使用prepend_before_action
。
是的,您的代码将按预期工作。
派生类(B)上的before_filters在基类(A)的before_filters之前调用。 所以调用方法的顺序是:
- set_user()
- set_post()
- 节目()
另请注意,after_filters以相反的顺序调用,最先导出。