Rails 6 +,zeitwerk自动加载器和命名空间常量

问题描述 投票:0回答:1

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文件,这样会更清洁。

如果您只有Users::Create,一般的Rails开发人员可能会寻找app/models/users/create.rb文件。

我不喜欢将其命名为Users::CreateService的方法,对我来说似乎很不雅。

我不是唯一使用这种约定的人;还有其他人遇到解决方案吗?我仍在浏览所有zeitwerk文档以寻找解决方案,但尚未找到解决方案。

autoload ruby-on-rails-6 zeitwerk
1个回答
0
投票

https://guides.rubyonrails.org/upgrading_ruby_on_rails.html#having-app-in-the-autoload-paths

[某些项目需要app / api / base.rb之类的东西来定义API :: Base,然后将app添加到自动加载路径中以经典模式完成该任务。由于Rails会自动将应用程序的所有子目录添加到自动加载路径中,因此我们还有另一种情况,即存在嵌套的根目录,因此设置不再起作用。我们在上文中曾解释过类似的原则,但同时也令人担忧。

如果要保留该结构,则需要从初始化程序的自动加载路径中删除子目录:

ActiveSupport::Dependencies.autoload_paths.delete("#{Rails.root}/app/api")
© www.soinside.com 2019 - 2024. All rights reserved.