gpt4 book ai didi

ruby-on-rails - 如何使用 Rails 6/Zeitwerk 在 Rails 初始化器中预加载关注点?

转载 作者:数据小太阳 更新时间:2023-10-29 07:37:17 27 4
gpt4 key购买 nike

我正在使用一个初始化器,它通过将一些应用程序问题包含到第三方库中来对应用程序启动进行一些猴子修补。基本上:

# config/initializers/my_initializer.rb

class SomeExternalLib
include MyConcern1
include MyConcern2
end

这在 Rails 5.2.3 中工作正常,但在升级到 Rails 6 时我收到以下弃用消息:

DEPRECATION WARNING: Initialization autoloaded the constants MyConcern1, and MyConcern2.

Being able to do this is deprecated. Autoloading during initialization is going to be an error condition in future versions of Rails.

Reloading does not reboot the application, and therefore code executed during initialization does not run again. So, if you reload ApplicationHelper, for example, the expected changes won't be reflected in that stale Module object.

These autoloaded constants have been unloaded.

Please, check the "Autoloading and Reloading Constants" guide for solutions. (called from at /Users/myuser/code/myapp/config/environment.rb:7)

我的担忧在 app/controllers/concerns/中。经过一些调查,我发现该路径没有被自动加载,但我无法弄清楚如何让 Zeitwerk(Rails 6 的新自动加载器)动态加载它。我尝试按照 here 中描述的 STI 自动加载模式进行操作,但没有运气。知道如何解决这个弃用警告吗?

最佳答案

如@Glyoko 的回答所述,对依赖项使用 require 可防止在初始化程序中自动加载。但是,正如@Puhlze 在他的评论中提到的那样,这样做会导致重新加载时出现问题。

我在 this post 中偶然发现了一种使用 Rails.configuration.to_prepare 的替代方法 | .

一个例子是:

# config/initializers/my_initializer.rb

Rails.configuration.to_prepare do
class SomeExternalLib
include MyConcern1
include MyConcern2
end
end

请注意,它在开发中的每个请求之前运行,但在生产中的预加载之前仅运行一次。

编辑:它似乎也适用于重新加载。

关于ruby-on-rails - 如何使用 Rails 6/Zeitwerk 在 Rails 初始化器中预加载关注点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56402093/

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