ruby-on-rails – 在其他人之后运行Rails控制器before_action回调

发布时间:2020-09-16 发布网站:编程之家
编程之家收集整理的这篇文章主要介绍了ruby-on-rails – 在其他人之后运行Rails控制器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),但我不认为有足够的回调来使这个回调问题).

总结

以上是编程之家为你收集整理的ruby-on-rails – 在其他人之后运行Rails控制器before_action回调全部内容,希望文章能够帮你解决ruby-on-rails – 在其他人之后运行Rails控制器before_action回调所遇到的程序开发问题。

如果觉得编程之家网站内容还不错,欢迎将编程之家网站推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您喜欢交流学习经验,点击链接加入编程之家官方QQ群:1065694478
编程之家官方公众号

微信公众号搜索 “ 程序精选 ” ,选择关注!

微信公众号搜索 “ 程序精选 ”
精选程序员所需精品干货内容!