1

通过切换到 Zeitwerk 自动加载器(Ruby 2.7.5 上的 Rails 6.1.4.4)为 Rails 7 做好准备。关闭了config.autoloader = :classicapplication.rb中的线路。应用程序正在加载 6.1 默认值。

开发模式运行良好,但启动时生产失败(在生产模式下本地也失败):

pid=4 tid=2l2g WARN: Zeitwerk::NameError: expected file /app/app/navigation_renderers/public_issue_renderer.rb to define constant PublicIssueRenderer, but didn't
pid=4 tid=2l2g WARN: /app/vendor/bundle/ruby/2.7.0/gems/zeitwerk-2.5.3/lib/zeitwerk/loader/callbacks.rb:25:in `on_file_autoloaded'

(这是在暂存环境中的 Heroku-20 上)。

但是,该文件确实将其定义为一个类:

module SimpleNavigation
  module Renderer
    class PublicIssueRenderer < SimpleNavigation::Renderer::Base
      [functions removed for brevity]
    end
  end
end

我不确定为什么双重/app/app存在,因为该目录只是在应用程序中以及其他所有内容:

来自相关 Rails 应用程序的文件目录的屏幕截图

4

2 回答 2

0

由于app/navigation_renderers属于自动加载路径,文件

app/navigation_renderers/public_issue_renderer.rb

应该PublicIssueRenderer在顶层定义。

这与说app/models/user.rb必须精确定义的规则相同User,而不是SimpleNavigation::Renderer::User

看?

classic此外,开发模式与该文件一起工作真的很奇怪。因为该文件也不符合classic预期,所以它们是相同的预期。

也许应用程序正在配置或做一些时髦的事情?

bin/rails zeitwerk:check通过吗?您可以在部署之前运行它。您还可以在 CI 中进行预加载,这是一个好主意(请参阅这些文档)。

于 2022-02-17T22:16:18.713 回答
0

我能够解决这个问题的唯一方法是将这两行放在文件的顶部:

class PublicIssueRenderer
end

然后继续如上所示的模块。感觉不对,但它通过了 Zeitwerk 并且仍然有效。

于 2022-02-07T03:23:38.527 回答