gpt4 book ai didi

ruby-on-rails - 当 cache_classes = false 时,为什么包含在 Rails 引擎初始化程序中会发生故障?

转载 作者:行者123 更新时间:2023-12-04 15:26:39 24 4
gpt4 key购买 nike

我有一个引擎,它在其初始化程序中扩展另一个引擎的类,如下所示:

module MyApp
class Engine < ::Rails::Engine
initializer 'extend Product' do
AnotherApp::Product.send :include, MyApp::ProductExtender
end
end
end
ProductExtender模块在包含时调用 AnotherApp::Product 上的一些方法,例如
module ProductExtender
def self.included( model )
model.send :include, MethodsToCall
end

module MethodsToCall
def self.included( m )
m.has_many :variations
end
end
end

这适用于测试和生产环境,但是当 config.cache_classes = false ,它会抛出一个 NoMethodError当我尝试调用 ProductExtender 定义的东西时,比如@product.variations。

不用说,看到我所有的测试都通过了,然后又因为开发中的错误而受到猛烈抨击,这令人不寒而栗。当我设置 cache_classes = true 时它不会发生,但这让我怀疑我是否在做我不应该做的事情。

我的问题是双重的: 为什么会发生这种情况,是否有更好的方法来实现在另一个应用程序对象上扩展/调用方法的功能?

谢谢大家!

最佳答案

我设法使用 to_prepare 解决了这个问题 block 而不是初始化程序。 to_prepare block 在生产中和开发中的每个请求之前执行一次,因此似乎满足了我们的需求。

当我研究 Rails::Engine 时并不明显因为它继承自 Rails::Railtie::Configuration .

所以代替问题中的代码,我会:

module MyApp
class Engine < ::Rails::Engine
config.to_prepare do
AnotherApp::Product.send :include, MyApp::ProductExtender
end
end
end

关于ruby-on-rails - 当 cache_classes = false 时,为什么包含在 Rails 引擎初始化程序中会发生故障?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5852580/

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