【发布时间】:2023-04-24 15:58:01
【问题描述】:
我正在尝试编写一个扩展 InheritedResources 的插件。
具体来说,我想重写一些默认助手。
而且我希望它在安装后“正常工作”,无需对应用程序代码进行任何更改。
功能在模块中提供,需要包含在正确的位置。问题是在哪里? :)
第一次尝试是在我插件的 init.rb 中进行:
InheritedResources::Base.send :include, MyModule
它在生产中工作,但在开发中惨遭失败,因为 InheritedResource::Base 声明为 unloadable,因此它的代码在每次请求时都会重新加载。所以我的模块是针对第一个请求的,
然后它就消失了。
InheritedResource::Base 再次被任何使用它的控制器“拉入”:
Class SomeController < InheritedResource::Base
但是没有代码“拉入”我的扩展模块,因为它没有在任何地方被引用,除了 init.rb,它没有在每个请求上重新加载
所以现在我只是将模块手动包含在每个需要它的控制器中,这很糟糕。 我什至不能在 ApplicationController 中包含它一次,因为 InheritedResources 继承自它,因此它将覆盖任何更改。
更新
我不是在寻找有关如何“猴子补丁”的建议。扩展在生产中工作得很好。我的问题是如何在 InheritedResources 加载后准确地捕捉时刻以将我的扩展插入其中:)
更新2
再次尝试澄清:
事件的顺序是
- a) rails 加载插件。我的插件在继承资源后加载并对其进行修补。
- b) 开发模式请求已得到处理并正常工作
- c) rails 卸载所有“可卸载”代码,其中包括所有应用程序代码以及 继承的资源
- d) 另一个请求进来
- e) rails 加载控制器,它继承自继承的资源
- f) rails 加载继承自 application_controller 的继承资源
- g) rails 加载 application_contrller(或者可能在这个阶段已经加载,不确定)
- g) 请求失败,因为没有人加载我的插件来修补继承资源。插件 init.rb 文件不会重新加载
我需要捕捉 g 和 h 之间的时间点
【问题讨论】:
标签: ruby-on-rails dependencies ruby-on-rails-plugins