0

我在使用 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 一起工作吗?

感谢您的提示!

4

1 回答 1

0

嗯,这应该是开箱即用的,对我来说看起来像是一个常规设置。

因为app/models它在自动加载路径中,Donation并且Donation::Download会自动加载,所以不需要自定义配置。

如果他们不这样做,则该应用程序必须做一些时髦的事情。我们可以调试它。

于 2022-02-17T21:31:56.087 回答