gpt4 book ai didi

ruby-on-rails-3 - 我如何使用 rails 在应用程序/模块中组织类的命名空间?

转载 作者:行者123 更新时间:2023-12-04 06:53:37 26 4
gpt4 key购买 nike

[这是“How I can modularize Rails model?”的后续问题]

Rails 的 app/models 目录中是否有组织类的方法?我是否必须为所有类使用单个顶级命名空间?

最初的动机是,我想将不继承自 ActiveRecord::Base 的业务逻辑类放入 app/models 目录中。搜索此站点会发现许多建议将业务逻辑类放在 app/models 目录中的答案。我发了a different question , 并得到了可以将此类类放入 lib 目录的建议。

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

实际上,我对此进行了实验,但在我看来,这不是 rails 所期望的。如果我创建这样一个类(如 some_mod_name/class_in_mod.rb 中的 SomeModName::ClassInMod ),它不会被加载。另外,我在模块中定义了常量。由于它们未加载,我无法使用它们。实际上,使用 rspec 它可以正常工作,但是使用 rails server 时,类不会加载。我确定它与自动加载问题有关。

除了上面提到的类之外,从 ActiveRecord::Base 继承的类可以放在 module 中的一些命名空间中。我也很好奇这是否有效。

换句话说,问题是:我可以通过配置要加载的这些文件来让 Rails 满意吗,或者 Rails 不是这样设计的?

最佳答案

是的,您可以在模块中定义一个 ActiveRecord 类。简单的方法是使用生成器:

./script/rails generate model logic/phase_logic
./script/rails generate model logic/evaluation_logic

请注意,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

您在模块中定义常量的问题是由于这样一个事实引起的,即您在定义模块中定义的常量仅围绕一个模型“包装”,来自您创建的两个模型。理解 ruby​​(和 Rails)的一个非常重要的部分 - 特别是对于具有强大编译语言背景的人 - 是要记住没有编译阶段,所以定义仅当使用该特定类时才读取和执行某些类。有时在应用服务器启动并处理数千个请求后一周

因此,正如我在 previous question 中所说的那样的回答,自动加载的问题在于,有时常量的定义是在试图使用它们的定义之后读取的。顺序是随机的——如果第一个使用的对象恰好是 EvaluationLogic,就会出现错误。如果第一个对象恰好是 PhaseLogic,一切都很好。

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

关于ruby-on-rails-3 - 我如何使用 rails 在应用程序/模块中组织类的命名空间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9712468/

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