我在用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
endeager_load_paths是Zeitwerk所必需的(根据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合作呢?
谢谢你的暗示!
发布于 2022-02-17 21:31:56
嗯,这应该是开箱即用的,在我看来就像一个常规的装置。
由于app/models在自动加载路径中,Donation和Donation::Download将被自动加载,因此不需要自定义配置。
如果他们不这样做,应用程序必须做一些古怪的事情。我们可以调试它。
https://stackoverflow.com/questions/71057288
复制相似问题