Rails自动加载魔术错误!

简而言之,在继承类时,请使用显式的模块命名空间,或尽可能避免使用复杂的命名空间。

类和模块常量取决于自动加载路径查找的顺序(Ruby on Rails功能),更多内容请参见下文。 因此,类的可发现性可能会根据继承类的名称和位置而有所不同。 当多个类共享相同的名称时(例如在我们的Rails应用程序中),这种细微差别会影响隐式类的继承。

Ruby on Rails在其autoload_paths (默认情况下, app中的所有app子目录和启动时出现的引擎,以及app/*/concern )中有两种主要算法可用于不断查找。

可以使用以下命令检查autoload_paths的值:

  $ bin / rails r'放入ActiveSupport :: Dependencies.autoload_paths' 
.../app/assets
.../app/controllers
.../app/helpers
.../app/mailers
.../app/models
.../app/resources # This is loaded before models/

.../app/controllers/concerns
.../app/models/concerns
.../test/mailers/previews

在尝试清理一些代码时,我无意间创建了一个难以发现的错误。 以下是一些示例代码,可以查看实际存在的问题:

希望Ruby on Rails自动加载现在更加清晰。 您可以随时在此处阅读更多信息并改进Ruby on Rails文档。 如果您有任何疑问或发现错误,请在此处发表评论或通过Twitter与我联系!

在Rails 5中,默认情况下禁用自动加载。