【发布时间】:2020-07-16 16:11:13
【问题描述】:
这个问题可能只是针对 Ruby,但正是因为在 Rails 上工作,才促使我提出这个问题。
假设我正在创建一个新的module,以便我可以更好地组织相关/耦合代码。我们称这个模块为amazing_feature,它的所有类/子模块都位于app/services 目录中。所以按照代码加载原则,整个模块应该在app/services/amazing_feature目录下才能正常加载。
假设我有两个用于这个模块的类:
# app/services/amazing_feature/thing_one.rb
module AmazingFeature
class ThingOne
...
end
end
# app/services/amazing_feature/thing_two.rb
module AmazingFeature
module ThingTwo
...
end
end
我希望有一些常量可用于module AmazingFeature 中的所有类/子模块,以及可从AmazingModule 命名空间用于任何外部代码(例如,其他控制器和模型,在Rails 的观点)。例如,如果我想定义MY_CONSTANT = 1,那么它可以在模块内以MY_CONSTANT 的形式访问,从模块外部以AmazingFeature::MY_CONSTANT 的形式访问。
所以问题是,我如何才能在 Ruby 或 Rails 中真正做到这一点?我有一些想法,认为可能有效的方法,或者我在其他地方看到的方法,例如其他 SOF 帖子:
- 直接在
app/services中为将常量直接关联到模块的模块创建一个文件。我不喜欢这种方法,因为将与模块耦合的文件放在其子目录之外感觉很奇怪。
# app/services/amazing_feature.rb
module AmazingFeature
MY_CONSTANT = 1
end
- 全局加载常量作为 Rails 初始化程序(即在
config/initializers中)。我对这种方法也有同样的厌恶。 - 在子目录中创建
Constants模块,以便常量与模块的所有其他代码位于同一位置。我只是不知道如何正确地将这些常量与父模块相关联,因此此代码示例中缺少部分。
# app/services/amazing_feature/constants.rb
module AmazingFeature
module Constants
MY_CONSTANT = 1
end
end
# Now what??? :(
- 其他方法?我在这里不知所措。
谢谢。
【问题讨论】:
-
你看过关于自动加载代码的rails指南吗?你想彻底阅读这篇文章,因为它在很多方面都有帮助......guides.rubyonrails.org/autoloading_and_reloading_constants.html
标签: ruby-on-rails ruby