【发布时间】:2023-04-05 12:41:02
【问题描述】:
当我使用 rails 6 / zeitwerk 时,如何扩展 gem 定义的类?
我已经尝试在初始化程序中使用require 来首先加载类。
我尝试在初始化程序中执行此操作,并仅引用该类以让自动加载首先加载它。
但这两种方法都破坏了开发模式下的自动重新加载。
我尝试将其放入lib/ 或app/,但这不起作用,因为这样就永远不会从 gem 加载该类,因为我的新文件在加载顺序中更高。
有一个类似的问题here,但该问题专门询问如何在初始化程序中执行此操作。我不在乎它是否在初始化程序中完成,我只是想弄清楚如何以某种方式做到这一点。
做这种事情的标准方法是什么?
我确实有一个讨厌的 hack 似乎在起作用,但我不喜欢它(更新:这也不起作用。重新加载仍然失败):
the_gem_root = $LOAD_PATH.grep(/the_gem/).grep(/models/).first
require("#{the_gem_root}/the_gem/some_model")
class SomeModel
def my_extension
...
end
end
【问题讨论】:
-
这里为什么需要 require 呢?我希望您的 gem 在 application.rb 中加载 bundler.require。还有你的文件现在在哪里?
-
我是开发模式,我猜gem不是eager加载的吧?因此,当我尝试重新打开课程时,如果没有要求,我最终会定义一个新课程。我已经在 config/initializer.rb 和 app/models 中尝试了我的覆盖,但没有成功。
-
这似乎不是 Zeitwerk 的问题。 Zeitwerk 不会自动加载 Afaik 宝石。除非您有一些自定义设置,否则它们通常仍会在 application.rb 中加载
Bundler.require(*Rails.groups)。您可以发布您的 Gemfile 的相关部分吗?我想知道您的宝石是否不在开发组中。顺便说一句,这是哪颗宝石? -
这是来自 Gemfile 的行(它是邮箱 gem)。它没有安装在任何特定组内。
gem 'mailboxer', git: 'https://github.com/booleanbetrayal/mailboxer.git', branch: 'update_attributes-update'我在application.rbBundler.require(:default, Rails.env)有这条线