ruby-on-rails – 在其他人之后运行Rails控制器before_action回
发布时间:2020-12-17 01:57:09 所属栏目:百科 来源:网络整理
导读:是否有一种简单的方法可以附加到rails中的控制器的before_action列表,以便稍后添加的其他before_action回调将在我的回调之前而不是之后运行? 我的用法是我担心其他控制器将包含,并且我希望包含它的控制器能够添加他们自己的before_action方法,但是在所有这
是否有一种简单的方法可以附加到rails中的控制器的before_action列表,以便稍后添加的其他before_action回调将在我的回调之前而不是之后运行?
我的用法是我担心其他控制器将包含,并且我希望包含它的控制器能够添加他们自己的before_action方法,但是在所有这些之后调用我的一个方法,但仍然在实际操作之前. 由于它是一个与大量开发人员相当大的代码库,为了实用性,我不希望这个问题的每个用户都必须执行prepend_before_action,或者必须记住在他们声明他们的回调而不是在顶部之后包含我的模块.类. 我很确定没有内置的方法可以做到这一点,而且我对ruby中的元编程并不是很熟悉.但是,当回调正在运行时,是否有某种方法可以挂钩回调列表的内部,并在末尾添加新的回调或其他内容? 解决方法
我发现了一个非常简单的解决方案 – 查看ActiveSupport :: Callbacks源代码,我注意到CallbackChain#append_one方法就是在每次添加回调时调用remove_duplicates方法,这是将before_action回调添加到链中.所以我可以在我的模块中执行以下操作,覆盖before_action方法:
module MyModule extend ActiveSupport::Concern included do before_action :my_last_callback end class_methods do def before_action(*args,&blk) method(:before_action).super_method.call(*args,&blk) method(:before_action).super_method.call(:my_last_callback) end end def my_last_callback # do stuff after all before_action callbacks end end 现在,子类可以添加尽可能多的before_action回调,并且它们将维护它们的顺序,但my_last_callback总是最后被调用. (回调链中现在会有额外的插入/删除,现在回调数量可能是O(n ^ 2)而不是O(n),但我不认为有足够的回调来使这个回调问题). (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |