Rails 6+ 默认自动加载器是 zeitwerk,这似乎比以前的方法有了很大的改进。
然而,zeitwork 遵循 Rails 项目的惯例,即任何内容app/*
是自动加载的,不需要命名空间。
这非常适合app/models/user.rb
因为你不必使用Models::User
但只能参考User
.
不过,我添加了自己的app/services
目录和我将我的服务对象命名为Services::Users::Create
,这将映射到app/services/users/create.rb
.
Zeitwork 抛出错误,表明我的类常量不存在,因为它期望Users::Create
(没有Services::
字首)。
无论如何,是否有配置 zeitwork 来要求Services::
在这些情况下的命名空间?在我看来,将代码阅读为更清晰Services::Users::Create
并且知道您正在寻找app/services/users/create.rb
file.
如果你刚刚有Users::Create
,一般的 Rails 开发人员可能会寻找app/models/users/create.rb
file.
我不喜欢它的命名方式Users::CreateService
,这对我来说似乎很不优雅。
我不可能是唯一一个使用这样的约定的人;还有其他人遇到过解决方案吗?我仍在浏览所有 zeitwerk 文档寻找解决方案,但尚未找到。
https://guides.rubyonrails.org/upgrading_ruby_on_rails.html#having-app-in-the-autoload-paths https://guides.rubyonrails.org/upgrading_ruby_on_rails.html#having-app-in-the-autoload-paths
有些项目需要像 app/api/base.rb 这样的东西来定义 API::Base,并将 app 添加到自动加载路径以在经典模式下完成此任务。由于 Rails 会自动将 app 的所有子目录添加到自动加载路径中,因此我们还有另一种情况,即存在嵌套的根目录,因此安装程序不再有效。类似的原则我们在上面解释过,但也有一些担忧。
如果您想保留该结构,则需要从初始化程序中的自动加载路径中删除子目录:
ActiveSupport::Dependencies.autoload_paths.delete("#{Rails.root}/app/api")
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)