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

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

几个随机的例子:

  • "strategy"类,通过facebook等使用密码进行身份验证.
  • 封装参数的"XParams"对象或处理参数的"XCreator"对象,以执行一些复杂的操作,最终导致创建一些AR模型
  • 向外部API发出请求或封装这些请求和响应的类
  • 可以替代真实AR模型的假模型(例如来宾用户)
  • 重新安排工作
  • 存储和读取Redis信息的类
  • classes that execute some specific actions like processing data, generating reports etc. and are called from 重新安排工作 or rake tasks

我现在有很多这样的东西,其中一些被添加到lib中,最后变成了一堆随机的类和模块,还有一些潜入app/models中.我想以某种方式组织这件事,但我不知道从哪里开始.

应该只有AR型号进入app/models吗?或者也可以放一些域或助手模型吗?你如何决定某样东西是否是模型?

所有不符合app的都应该进入lib吗?或者我应该在app中添加一些新的自定义子目录?哪些子目录,以及如何划分自定义类?

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

推荐答案

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

但我建议你看看这篇帖子

在当前的一个项目中,我在app/models下有大量非ActiveRecord对象,它可以工作,但并不理想

我在侧项目上try 过的其他替代方案(比如我们有一堆命令对象)

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

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

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

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

Ruby-on-rails相关问答推荐

使用ActiveSupport::TimeWithZone将UTC转换为用户定义的时区

Ruby:如何通过谓词将一个集合拆分为 ruby​​ 中的两个集合?

在 Rails 中进行 Http 基本身份验证

使用 RSpec 和 Capybara (Rails) 测试重定向

Rails 上的 build 和 new 有什么区别?

如何在 Rails 中使用 instance_eval 子句删除验证?

如何将 Ruby 哈希转换为 XML?

运行多个 Rails Server 实例

将 defer 属性添加到 javascript_include_tag Rails

如何将 yaml 文件解析为 ruby​​ 哈希和/或数组?

Phusion 乘客(适合傻瓜!)

Rails 3 SSL 路由从 https 重定向到 http

Ruby on Rails 基本概念总结

我如何在具有活动记录的 Rails 中使用两个不同的数据库?

has_many :通过 class_name 和 foreign_key

如何跳过失败的迁移? (耙分贝:迁移)

我怎样才能看到水豚在失败的黄瓜步骤中发现了什么?

Coffeescript ||= 模拟?

如何在 rake 任务中强制 RAILS_ENV?

我什么时候需要在 Rails 中重新启动服务器?