在Rails应用程序中放置课程的方法不适合任何地方 [英] guidelines for where to put classes in Rails apps that don't fit anywhere

查看:137
本文介绍了在Rails应用程序中放置课程的方法不适合任何地方的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想知道有没有关于在Rails应用程序中放置非标准Ruby文件的任何最佳做法,那些不符合任何默认目录( controllers / 型号等)。



我在谈论控制器/模型等使用的类,但不是任何Rails基类的子类。课程包括从模型中提取的功能,使其更少的脂肪。其中一些看起来像模型,但不是AR模型,其中一些看起来更像是服务,有些是两者之间或其他东西。



几个随机的例子:




  • 通过Facebook等处理身份验证的策略类。

  • XParams对象封装了params或XCreator对象来处理params的处理,以执行一些复杂的操作,导致最终创建一些AR模型。

  • 使请求到外部的AR模型API或封装这些请求和响应

  • 可以替代真正AR模型的假模型(例如访客用户)

  • 重新启动作业

  • 存储和读取来自Redis

  • 的类的类,它们执行一些特定操作,如处理数据,生成报告等,并从Resque作业或耙子任务调用



我现在有很多这些,其中一些em被添加到 lib ,最后是一堆随机的类和模块,一些潜入 app / models 。我想以某种方式组织起来,但是我不知道从哪里开始。



只有AR模型才能进入 app / models ?或者也可以放置任何域或帮助模型吗?你如何决定一个东西是一个模型?



如果不适合应用程序的所有内容进入 LIB ?或者也许我应该添加一些新的自定义子目录到 app ?什么子目录,以及如何划分自定义类?



在项目中如何处理?我知道每个项目都有所不同,但必须有一些相似之处。

解决方案

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



但我建议您查看这个帖子
- http://blog.codeclimate.com/blog/2012/02/07/what-c​​ode-goes-in -the-lib目录/
- 一定要阅读所有的评论



在一个当前的项目我有一吨非 - 在应用程序/模型下的ActiveRecord对象,它工作但不理想
i在lib下面的可重用非特定代码



其他替代方案我已经尝试了项目(说我们有一堆命令对象)
rails是一个痛苦的命名空间在应用程序下,它将所有东西加载到相同的命名空间默认情况下

  app / 
commands /
products / create_command.rb #产品:: CreateCommand
产品/ update_price_command.rb#产品:: UpdatePriceCommand

除了src或app_name目录之外的所有内容

  app / 
src /
commands /
create_product.rb#命令:: CreateProduct
update_product_price.rb#命令:: UpdateProductPrice

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


I'm wondering if there are any best practices about where to put non-standard Ruby files in Rails apps, those that don't fit in any of the default directories (controllers/models etc.).

I'm talking about classes that are used by controllers/models etc., but are not subclasses of any of the Rails base classes. Classes that include functionality extracted from models to make them less fat. Some of them kind of look like models but aren't AR models, some of them look more like "services", some are something in between or something else.

A few random examples:

  • "strategy" classes that handle authentication with password, via facebook etc.
  • "XParams" objects that encapsulate params or "XCreator" objects that handle processing of params to execute some complex action that results in creating some AR models in the end
  • classes that make requests to external APIs or encapsulate those requests and responses
  • fake models that can be substituted for a real AR model (e.g. guest user)
  • Resque jobs
  • classes that store and read information from Redis
  • classes that execute some specific actions like processing data, generating reports etc. and are called from Resque jobs or rake tasks

I've got quite a lot of these now, some of them are added to lib which ends up as a pile of random classes and modules, some sneak into app/models. I'd like to organize this somehow, but I don't know where to start.

Should only AR models go into app/models? Or is it ok to also put there any domain or helper models? How you decide if something is a model?

Should everything that doesn't fit into app go into lib? Or maybe I should add a few new custom subdirectories to app? What subdirectories, and how do I divide the custom classes?

How do you handle this in your projects? I know every project is a bit different, but there must be some similarities.

解决方案

Good question - i don't have a concrete answer for you

but I recommend checking out this post - http://blog.codeclimate.com/blog/2012/02/07/what-code-goes-in-the-lib-directory/ - be sure to read through all the comments

on a current project i have a ton of non-ActiveRecord objects under app/models, it works but not ideal i put 're-useable' non application specific code under lib

other alternatives I have tried on side projects (say we have a bunch of command objects) rails is a pain when it comes to namespaces under app, it loads everything up into the same namespace by default

app/
  commands/
    products/create_command.rb         # Products::CreateCommand
    products/update_price_command.rb   # Products::UpdatePriceCommand

alternate, everything besides rails under src or an app_name directory

app/
  src/
    commands/
      create_product.rb         # Commands::CreateProduct
      update_product_price.rb   # Commands::UpdateProductPrice

I haven't come across a good solution for this, ideally the 2nd one is better, but would be nice to not have the additional directory under app, that way you open app and see controllers, commands, models etc...

这篇关于在Rails应用程序中放置课程的方法不适合任何地方的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆