[这是一个后续问题“How I can modularize Rails model?”]如何使用rails在app/modules中组织名称空间?
反正组织在app/models
目录的Rails的课? 我是否必须为所有类使用单个顶级命名空间?
最初的动机是,我想将不从ActiveRecord::Base
继承的业务逻辑类放入app/models
目录。在这个网站上搜索可以找到很多答案,推荐将商业逻辑类放在app/models
目录中。我发布了a different question,并得到了建议,可以将这些类放入lib
目录。
现在我很好奇。我想将这些类放入apps/models
目录中由其他人推荐的不同名称空间和目录中。可能吗?
其实,我尝试这一点,但在我看来,这就是轨道预计不会。如果我创建了这样的类(如some_mod_name/class_in_mod.rb中的SomeModName :: ClassInMod),它不会被加载。另外,我在模块中定义了常量。由于他们没有加载,我不能使用它们。其实,rspec
工作没有问题,但与rails server
,类不加载。我相信它与自动加载问题有关。
除了上面提到的类之外,从ActiveRecord::Base
继承的类可以放入module
中的某些名称空间中。我很好奇这个工作是否正常。
因此,换句话说,这样的问题:我可以让轨道高兴通过配置这些文件被加载,或不在轨道设计的方式?
谢谢。我仍然想知道为什么加载顺序与我预期的不同(你说这是随机的,我认为必须有一个触发器会导致实际的负载),但将常数放在'app/models中显然是个好主意/ logic.rb'现在会尝试改变这种方式。 – shigeya 2012-03-16 00:10:31
经过测试。甚至没有必要成为'ActiveRecord :: Base'的子类在'module Logic'中放置所有常量,将它放在'app/models/logic.rb'中解决了我的问题。非常感谢你。 – shigeya 2012-03-16 00:47:20
实际负载由第一个执行的代码行触发,其中使用了该类。当ruby尝试执行类似'if if; EvaluationLogic.new;否则PhaseLogic.new; end'和PhaseLogic尚未定义,然后(简化一点)自动加载机制找到文件'phase_logic.rb',执行它,并尝试再次执行该行代码。还有其他方式像STI。 – Arsen7 2012-03-16 08:32:29