我在使用 Rails 应用程序从经典的自动加载器切换到 Zeitwerk 时遇到了一些麻烦,该应用程序在 Rails 3 天里就已经出现了——所以那里有一些硬壳。
一些模型代码已被提取到模块中,这些模块嵌套在模型类(充当命名空间)中:
# app/models/donation
class Donation < ApplicationRecord
(...)
end
# app/models/donation/download
class Donation
module Download
def csv
(...)
end
end
end
然后在需要时动态使用这些模块:
donation = Donation.find(...)
donation.extend(Donation::Download).csv
由于默认情况下不添加子目录app/models
,因此它在 中明确完成application.rb
:
Dir[
"#{config.root}/app/models/*/"
].then do |paths|
config.autoload_paths += paths
config.eager_load_paths += paths
end
Zeitwerkeager_load_paths
需要这些(根据 Rails 指南),但是,Zeitwerk 似乎不喜欢这个星座:
% rails zeitwerk:check
Hold on, I am eager loading the application.
expected file app/models/donation/download.rb to define constant Download
奇怪,因为Download
是在那里定义的。知道这里发生了什么以及如何最好地重构事物以与 Zeitwerk 一起工作吗?
感谢您的提示!