过滤器出现之前的顺序是什么?具体来说,关于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文档中找不到任何相关内容。
答案 0 :(得分:21)
我建议您在过滤器上查看 the source code 和 API Docs 。
默认排序应为
:set_post
:set_user
我认为如果您想将:set_user
推到堆栈顶部,可以将A
中的行更改为
prepend_before_action :set_user
另外值得指出的是,这不是关于该主题的唯一问题;有others here on SO。
根据您的具体情况,您似乎需要更改A
,如上所述,以便@user
在{{1} set_post
之前分配B
跑。
从4.2.6开始(可能在早期版本中已更改),现在订购在child之前是父级:
:set_user
:set_post
答案 1 :(得分:5)
从Rails 4.2.6开始,接受的答案不再适用。它可能早些时候已经改变了,但那是我现在的版本。
现在在子过滤器之前调用父过滤器,因此现在排序为:
:set_user
:set_post
而且,如果你考虑一下,那个顺序真的更有意义。如前所述,如果您需要孩子在父母之前调用过滤器,则需要使用prepend_before_action
。
答案 2 :(得分:0)
是的,您的代码将按预期工作。
派生类(B)上的before_filters在基类(A)的before_filters之前调用。所以调用方法的顺序是:
另请注意,after_filters以相反顺序调用,最先导出。