如何使用rails组织app/modules中的类的命名空间?

shi*_*eya 3 ruby-on-rails-3

[这是" 如何模块化Rails模型? " 的后续问题

反正有没有在app/modelsRails目录中组织类?我是否必须为所有类使用单个顶级命名空间?

最初的动机是,我希望把它不从继承业务逻辑类ActiveRecord::Base进入app/models目录.搜索此站点会显示许多建议将业务逻辑类放在app/models目录中的答案.我发布了一个不同的问题,并得到了建议,可以将这些类放入lib目录.

现在我很好奇.我想将这些类放在apps/models其他人推荐的目录中的不同命名空间和目录中.可能吗?

实际上,我试验了一下,但在我看来,这不是预期的铁轨.如果我创建这样的类(如some_mod_name/class_in_mod.rb中的SomeModName :: ClassInMod),则不会加载它.另外,我在模块中定义了常量.由于它们没有装载,我不能使用它们.实际上,rspec它的工作没有问题,但有rails server,该类没有加载.我确定它与自动加载问题有关.

除了上面提到的类之外,从中继承的类ActiveRecord::Base可以放在一些名称空间中module.我很好奇这项工作是否合适.

换句话说,问题是:我可以通过配置要加载的这些文件来使轨道高兴,还是不是rails设计的方式?

Ars*_*en7 6

是的,您可以在模块中定义ActiveRecord类.简单的方法是使用发电机:

./script/rails generate model logic/phase_logic
./script/rails generate model logic/evaluation_logic
Run Code Online (Sandbox Code Playgroud)

请注意,Rails将另外创建一个带有模块定义的文件.在这种情况下:

# app/models/logic.rb
module Logic
  ...
end

# app/models/logic/phase_logics.rb
class Logic::PhaseLogic < ActiveRecord::Base
  ...
end

# app/models/logic/evaluation_logics.rb
class Logic::EvaluationLogic < ActiveRecord::Base
  ...
end
Run Code Online (Sandbox Code Playgroud)

你在模块中定义常量的问题是由于你定义了定义模块中的常量"包裹"在你创建的两个模型周围的事实引起的.理解ruby(和Rails)的一个非常重要的部分 - 特别是对于在编译语言中具有强大背景的人 - 要记住没有编译阶段,所以只有在使用特定类时才读取和执行某些类的定义.有时在应用程序服务器启动并提供数千个请求后一周.

因此,正如我在上一个问题的答案中所说的那样,自动加载的问题是有时候定义的定义是在尝试使用它们的定义之后读取的.顺序是随机的 - 如果第一个使用的对象碰巧是EvaluationLogic,则出现错误.它的第一个对象恰好是PhaseLogic,一切都很好.

现在,当你有一个模块本身的文件,并在该文件中定义常量(app/models/logic.rb)时,自动加载将能够在任何类开始使用它们之前找到并执行定义.我希望一切都会好的.