gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 22:02:34 24 4
gpt4 key购买 nike

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 文档以寻找解决方案,但还没有找到。

最佳答案

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")

关于autoload - Rails 6+、zeitwerk 自动加载器和命名空间常量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58981862/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com