首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Zeitwerk在生产加载自定义SimpleNavigation呈现器时失败

Zeitwerk在生产加载自定义SimpleNavigation呈现器时失败
EN

Stack Overflow用户
提问于 2022-01-20 13:04:59
回答 2查看 447关注 0票数 1

通过切换到Zeitwerk autoloader (Ruby2.7.5上的Rails 6.1.4.4 ),为Rails 7做好准备。关闭application.rb中的application.rb行。应用程序正在加载6.1默认设置。

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

代码语言:javascript
复制
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上的一个暂存环境)。

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

代码语言:javascript
复制
module SimpleNavigation
  module Renderer
    class PublicIssueRenderer < SimpleNavigation::Renderer::Base
      [functions removed for brevity]
    end
  end
end

我不知道为什么双/app/app会存在,因为目录和其他所有内容都在app中:

EN

回答 2

Stack Overflow用户

发布于 2022-02-17 22:16:18

因为app/navigation_renderers属于自动路径,所以文件

代码语言:javascript
复制
app/navigation_renderers/public_issue_renderer.rb

应该在顶层定义PublicIssueRenderer

这是同一个规则,即app/models/user.rb必须精确地定义User,而不是SimpleNavigation::Renderer::User

看见?

而且,非常非常奇怪的是,开发模式在classic中与该文件一起工作。因为该文件也不符合classic的期望,所以它们是相同的期望。

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

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

票数 1
EN

Stack Overflow用户

发布于 2022-02-07 03:23:38

我唯一能通过的方法是把这两行放在文件的顶部:

代码语言:javascript
复制
class PublicIssueRenderer
end

然后继续上面所示的模块。感觉不对,但它通过了Zeitwerk,而且还在工作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70786794

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档