如何忽略 Zeitwerk for Rails 6 中的文件夹?

Posted

技术标签:

【中文标题】如何忽略 Zeitwerk for Rails 6 中的文件夹?【英文标题】:How to ignore a folder in Zeitwerk for Rails 6? 【发布时间】:2020-01-27 06:26:31 【问题描述】:

简单的问题,但不知怎的,答案让我无法理解。

在使用 Zeitwerk 迁移到 Rails 6 时,我得到:

Please, check the "Autoloading and Reloading Constants" guide for solutions.
 (called from <top (required)> at APP_ROOT/config/environment.rb:7)
rails aborted!
Zeitwerk::NameError: wrong constant name Enforce-calls-to-come-from-aws inferred by Module from directory

  APP_ROOT/app/junkyard/enforce-calls-to-come-from-aws

Possible ways to address this:

  * Tell Zeitwerk to ignore this particular directory.
  * Tell Zeitwerk to ignore one of its parent directories.
  * Rename the directory to comply with the naming conventions.

这看起来很棒:这是一个垃圾文件夹,永远不应该加载,所以忽略它是完全合理的。

https://github.com/fxn/zeitwerk 上的 Zeitwerk 文档说

tests = "#__dir__/**/*_test.rb"
loader.ignore(tests)
loader.setup

是您忽略文件夹的方式。很公平。但是我如何找到loader?关于 Zeitwerk 自动加载 (https://guides.rubyonrails.org/autoloading_and_reloading_constants.html) 的 Rails 指南没有提到如何直接忽略文件夹,但确实提到了隐藏在 Rails.autoloaders.main 的自动加载器,所以我认为

Rails.autoloaders.main.ignore("#__dir__/junkyard/**/*.rb")

Rails.autoloaders.main.ignore("#__dir__/app/junkyard/**/*.rb")

将是要走的路。没有运气。我试过把它放在application.rbinitializers/zeitwerk.rb 中,但都没有奏效。

任何想法在哪里以及如何在 Rails 中使用 Zeitwerk 忽略文件夹?

PS:是的,我知道我应该从app 中删除它,我会的。但这个问题仍然令人头疼。

【问题讨论】:

【参考方案1】:

我遇到了同样的问题,结果它抱怨文件夹名称。

将此添加到application.rb 可能对您有用:

Rails.autoloaders.main.ignore(Rails.root.join('app/junkyard'))

【讨论】:

谢谢@ajkerr,有帮助! 谢谢!将它放在一个感觉比 application.rb 更好的初始化程序中对我有用。 @IainBryson 如果它解决了你的问题,你应该接受这个答案

以上是关于如何忽略 Zeitwerk for Rails 6 中的文件夹?的主要内容,如果未能解决你的问题,请参考以下文章

嵌套 Rails 模型 - 创建时忽略 child_index

Rails6 - PurgeCSS 忽略来自 image_pack_tag 的样式

如何在 Rails 开发中忽略延迟作业查询日志记录

Rails 6 和 Google Maps for Rails

Ruby on Rails 6 PUT json 参数未设置

Rails 4 在 for 循环中更新