不影响 Rails 中类命名空间的目录

Directories that do not affect class namespace in Rails

提问人:aef 提问时间:7/10/2019 更新时间:7/12/2019 访问量:304

问:

我正在构建一个 Rails 5.2.x 应用程序,我正在寻找改进项目目录结构的方法。

我的应用程序中的一些模型类表示事件,我想将它们与不表示事件的其他类分开。

所以理想情况下,我想要一个这样的子目录:events

[RAILS ROOT]/app/models/something.rb
[RAILS ROOT]/app/models/events/some_event.rb

其中包含和报复性。SomethingSomeEvent

不过,在这种情况下,Rails 似乎需要我命名事件类。Events::SomeEvent

我的实际类已经大量使用命名空间,因此名称又长又笨拙。我希望能够在开发时轻松地在视觉上分离我的事件类,而不需要它们有更长的名称。

此外,如果发生事件,我想避免更改类名,因为加载历史数据会使用该名称反序列化到正确的类中。

有没有办法在 Rails 中引入额外的子目录,而不需要将它们表示为命名空间组件?如果是这样,我真的很想知道怎么做。

ruby-on-rails ruby 命名空间 自动加载 目录结构

评论

2赞 Jordan Running 7/11/2019
我不知道答案,但我怀疑您可以在自动加载和重新加载常量 Rails 指南中找到它。
2赞 spickermann 7/11/2019
Ruby on Rails 经常使用约定而不是配置,并且非常固执己见。我的建议是:遵守这些惯例,不要试图与它们作斗争。如果你离开默认路径,它会让你的生活更加艰难,你肯定会后悔的。
0赞 aef 7/11/2019
Rails 及其社区从一开始就用这个论点来为它缺乏灵活性找借口。但是,约定胜于配置的想法并不意味着这一点。它只是暗示存在理智的默认值。总的来说,Rails 在这方面已经变得更好了,而且应该做得更好,因为随着 Rails 应用程序的增长,Rails 方式不适合,并且阻碍了可维护性。

答:

1赞 Abhishek Kushwaha 7/12/2019 #1

约定胜于配置的想法是让你以更简单和传统的方式编写代码,尽管如此,Rails 还是为你提供了很大的灵活性,让你在应用程序中反映你的想法。在你的例子中,如果你想为你的模型引入额外的目录,只需在config/application.rb中添加config.autoload_paths+= %W(#{config.root}/app/models/events)(在我的情况下是图像,图片深度相同),这样你的类就看起来像这样了:

enter image description here

我的类看起来像普通的类,没有任何命名空间。这应该可以解决您的目的。