在适合任何地方的Rails应用程序中放置类的指南

Kub*_*der 42 ruby directory ruby-on-rails organization models

我想知道是否有任何关于在Rails应用程序中放置非标准Ruby文件的最佳实践,哪些不适合任何默认目录(controllers/ models等).

我说的是控制器/模型等使用的类,但不是任何Rails基类的子类.包含从模型中提取的功能的类,以减少它们的负担.其中一些看起来像模型,但不是AR模型,其中一些看起来更像"服务",有些是介于两者之间或其他东西.

一些随机的例子:

  • 通过facebook等处理密码验证的"策略"类.
  • 封装params或"XCreator"对象的"XParams"对象处理params的处理以执行一些复杂的动作,最终导致创建一些AR模型
  • 向外部API发出请求或封装这些请求和响应的类
  • 可替代真实AR模型的假模型(例如访客用户)
  • Resque工作
  • 存储和读取Redis信息的类
  • 执行某些特定操作的类,如处理数据,生成报告等,并从Resque作业或rake任务调用

我现在已经有了很多这些,其中一些被添加到lib最后作为一堆随机类和模块,一些潜入app/models.我想以某种方式组织这个,但我不知道从哪里开始.

只应该进入AR车型app/models吗?或者也可以放置任何域或帮助模型?你如何决定某件事是模特?

如果不适合的一切都app进入lib?或许我应该添加一些新的自定义子目录app?什么子目录,以及如何划分自定义类?

你如何在你的项目中处理这个?我知道每个项目都有点不同,但必须有一些相似之处.

hou*_*se9 15

好问题 - 我没有具体的答案

但我建议查看这篇文章 - http://blog.codeclimate.com/blog/2012/02/07/what-c​​ode-goes-in-the-lib-directory/ - 一定要仔细阅读所有评论

在当前的项目中我在app/models下有很多非ActiveRecord对象,它工作但不理想我在lib下放了're-useable'非应用程序特定代码

我在侧面项目中尝试过的其他替代方案(比如我们有一堆命令对象)rails在app下的命名空间时很痛苦,它默认将所有内容加载到同一个命名空间中

app/
  commands/
    products/create_command.rb         # Products::CreateCommand
    products/update_price_command.rb   # Products::UpdatePriceCommand
Run Code Online (Sandbox Code Playgroud)

alternate,除了src或app_name目录下的rails之外的所有内容

app/
  src/
    commands/
      create_product.rb         # Commands::CreateProduct
      update_product_price.rb   # Commands::UpdateProductPrice
Run Code Online (Sandbox Code Playgroud)

我没有找到一个很好的解决方案,理想情况下,第二个更好,但很高兴没有在应用程序下的额外目录,这样你打开应用程序,看到控制器,命令,模型等...

  • CodeClimate链接的+1,这是我迄今为止在这个主题上看到的最好的资源. (2认同)
  • http://stackoverflow.com/questions/1068558/oo-design-in-rails-where-to-put-stuff上接受的答案写得非常好. (2认同)

Dav*_* S. 8

您触及了许多不同的用例,我认为这部分最接近"正确"的答案:

我现在有很多这些,其中一些被添加到lib,最终成为一堆随机类和模块,一些潜入app/models.我想以某种方式组织这个,但我不知道从哪里开始.

这在我的书中非常正确.你没有提到的一件事是将各种碎片提取到不同的宝石中.与外部服务相关的类是提取的最佳候选者,如果它们足够通用,则是策略类.这些可以是私有的,因为运行您自己的gem服务器并不难,然后您可以明显地在ROR应用程序中重用它们.

最后也是最具体的一点,我将重建工作归入lib/jobs.

我的经验法则是,如果它是某种类型的模型,它会进入app/models.如果不是,它可能属于中lib或一些适当命名的子目录物,如lib/jobs,lib/extensions,lib/external,等.