gpt4 book ai didi

ruby-on-rails - 如何扩展 'unloadable' Rails 插件?

转载 作者:行者123 更新时间:2023-12-04 07:40:14 29 4
gpt4 key购买 nike

我正在尝试编写一个插件来扩展 InheritedResources .

特别是我想重写一些默认的助手。

我希望它在安装后“正常工作”,无需对应用程序代码进行任何更改。

功能在模块中提供,需要包含在正确的位置。问题是在哪里? :)

第一次尝试是在我的插件的 init.rb 中进行:

InheritedResources::Base.send :include, MyModule

它在生产中有效,但在开发中惨遭失败,因为 InheritedResource::Base 声明为 unloadable,因此它的代码会在每次请求时重新加载。所以我的模块是为第一个请求而存在的,然后它就消失了。

InheritedResource::Base 被任何使用它的 Controller 再次“拉入”:

Class SomeController < InheritedResource::Base

但是没有代码“拉入”我的扩展模块,因为除了 init.rb 之外没有在任何地方引用它,它在每次请求时重新加载

所以现在我只是在每个需要它的 Controller 中手动包含该模块,这很糟糕。我什至不能将它包含在 ApplicationController 中一次,因为 InheritedResources 继承自它,因此它将覆盖任何更改。

更新

我不是在寻找有关如何“猴子补丁”的建议。该扩展在生产中运行得很好。我的问题是如何在 InheritedResources 加载后恰好捕捉时刻以将我的扩展程序插入其中:)

更新2

再次尝试澄清:

事件的顺序是

  • a) rails 加载插件。我的插件在 inherited_resources 之后加载并对其进行修补。
  • b) 一个开发模式请求得到满足并且有效
  • c) rails 卸载所有“可卸载”代码,包括所有应用程序代码以及继承资源
  • d) 另一个请求进来
  • e) rails 加载 Controller ,它继承自继承的资源
  • f) rails 加载继承自 application_controller 的继承资源
  • g) rails 加载 application_contrller(或者可能在这个阶段已经加载,不确定)
  • g) 请求失败,因为没有人加载我的插件来修补 inherited_resources。插件 init.rb 文件未重新加载

我需要捕获g和h之间的时间点

最佳答案

环境文件中的 Rails::Configuration、config 允许在开发模式下在每个请求之前运行的调度程序上注册一个回调,或者在生产模式下运行一次。

config.to_prepare do
# do something here
end

问题是,当 init.rb 文件运行时,我认为您的插件无法访问 config。这是一种直接在调度程序中注册回调的方法。只需将其放入 init.rb 文件即可。

require 'dispatcher'
::Dispatcher.to_prepare do
puts "hi there from a plugin"
end

警告:我不知道这可能有什么副作用。如果可能,请尝试访问 config 并以正确的方式注册回调。

关于ruby-on-rails - 如何扩展 'unloadable' Rails 插件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2397740/

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