【问题标题】:How to ensure callback order?如何保证回调顺序?
【发布时间】:2017-10-05 18:45:38
【问题描述】:

比如说,我有一个包含多个插件的 RoR 应用程序。这些插件中的每一个都在模型上实现了 after_save 回调。我需要再创建一个带有两个回调的插件,比如startfinish。如何保证回调的执行顺序如下?

  • MyPlugin.start
  • OtherPlugin_1.after_save_1
  • OtherPlugin_1.after_save_X
  • OtherPlugin_X.after_save_1
  • ...
  • MyPlugin.finish

即我的回调应该在任何其他 after_save 之前调用,并且在所有其他 after_save 回调完成执行之后立即调用。

【问题讨论】:

  • 您是否受限于安全?提交后你不能完成吗?
  • @Leito,这是目前的一个选项,因为到目前为止似乎没有 after_commit 回调,但我只想在没有更通用的解决方案时才使用它。
  • 我建议在模型上创建一个 after_save,然后在该方法中,按照您想要的顺序调用每个插件函数。没有必要让插件导出 after_save 回调而不是常规模型方法。
  • @maxpleaner,我无法更改模型,但我可以创建一个“元插件”,在单个 after_save 回调中调用所有其他方法。猜猜这可能会奏效。我想我什至可以根据一些方法命名约定自动收集这些方法。

标签: ruby-on-rails ruby callback ruby-on-rails-plugins


【解决方案1】:

这应该可以通过对 MyPlugin.start 使用 prepend: true 来实现,如下所示:

after_save :start, prepend: true

假设没有其他插件使用:prepend

关于 MyPlugin.finish:唯一的选择(据我所知)是确保插件最后执行(例如,将其命名为 zzz)。

【讨论】:

    猜你喜欢
    • 2020-04-30
    • 2017-08-28
    • 1970-01-01
    • 2017-07-10
    • 1970-01-01
    • 1970-01-01
    • 2019-03-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多