gpt4 book ai didi

ruby-on-rails - 在其他人之后运行 Rails Controller before_action 回调

转载 作者:数据小太阳 更新时间:2023-10-29 07:38:54 24 4
gpt4 key购买 nike

有没有一种简单的方法可以附加到 Rails 中 Controller 的 before_action 列表,这样以后添加的其他 before_action 回调将在我的回调之前而不是之后运行?

我的用途是我担心其他 Controller 会包含,我希望包含它的 Controller 能够添加自己的 before_action 方法,然后在之后调用我的方法之一所有这些,但仍在实际行动之前。

因为它是一个相当大的代码库,有很多开发人员,为了可用性,我不希望每个关注这个问题的用户都必须执行 prepend_before_action 或必须记住 include 我的模块在他们声明回调之后而不是在类的顶部。

我很确定没有内置的方法可以做到这一点,而且我对 ruby​​ 中的元编程也不是很熟悉。但是有什么方法可以在回调运行时连接到回调列表的内部,并在末尾添加一个新的回调之类的吗?

最佳答案

我找到了一个非常简单的解决方案 - 查看 ActiveSupport::Callbacks 源代码,我注意到 CallbackChain#append_one 方法将 before_action 回调添加到每次添加回调时,链都会调用 remove_duplicates 方法。所以我可以在我的模块中执行以下操作,覆盖 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),但我预计不会有足够的回调使它成为一个问题)。

关于ruby-on-rails - 在其他人之后运行 Rails Controller before_action 回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41558130/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com