Ruby on rails 轨道3.2-何处做“;实用程序“;函数被保存了吗?

Ruby on rails 轨道3.2-何处做“;实用程序“;函数被保存了吗?,ruby-on-rails,Ruby On Rails,我想将与创建/修改/删除对象相关的逻辑放在这些对象关联控制器之外的文件中。例如,我想从用户调用一个“create_event”方法,但我不想执行“event.create()”,因为涉及到各种不属于模型的逻辑。这些文件放在哪里?在图书馆?在Rails 4中会有什么不同吗 2009年也有人问过这个问题(),但因为那是四年前的事了,我想确定它是否仍然正确。lib目录通常用于与应用程序无关的逻辑,也就是说,您可以在另一个项目中重用。您可以将其视为一个目录,在其中放置逻辑,它应该是一个gem,但它仍然不

我想将与创建/修改/删除对象相关的逻辑放在这些对象关联控制器之外的文件中。例如,我想从用户调用一个“create_event”方法,但我不想执行“event.create()”,因为涉及到各种不属于模型的逻辑。这些文件放在哪里?在图书馆?在Rails 4中会有什么不同吗


2009年也有人问过这个问题(),但因为那是四年前的事了,我想确定它是否仍然正确。

lib目录通常用于与应用程序无关的逻辑,也就是说,您可以在另一个项目中重用。您可以将其视为一个目录,在其中放置逻辑,它应该是一个gem,但它仍然不是


正如@meagar所说的,
EventManager
是一种很好的方法,因为此代码将与其余的应用程序逻辑共存。另一种方法是创建一个
EventModule
(在
app/modules
中),该模块在处理事件时将包含助手方法。

lib显然不适合于此。正如阿方索所说,它是针对可以跨不同应用程序重用的类。比如pdf生成器之类的

Rails中的模型用于持久性和业务逻辑,但是当这个业务逻辑涉及多个业务逻辑时,它变得更加困难。就我个人而言,我喜欢在控制器和模型之间使用服务层来满足这种需求

我只是在控制器、模型和视图旁边创建一个文件夹,其中包含EventService之类的类

Rails 4


它不会随着Rails 4的出现而改变,即使这已经快一年了,我还是想重温一下,以防其他人偶然发现它。经过大量考虑,我最终创建了位于某些模型和控制器之间的服务类,用于处理复杂的表单和关系。这与上面的链接类似,并受到Ryan Bates的严重影响,如中所建议。在视频中,Ryan准确地说,“服务对象最适合于需要与复杂模型交互的复杂控制器操作,并且没有其他适合这种行为的地方。”这完美地描述了我的需求

当我提出我的第一个问题时,我是非常生疏的,所以它的措辞并没有它本来应该有的那么好。我觉得它给人的印象是想要从模特身上去掉基本的行为,但事实并非如此。我将详细说明,以防其他新Rails和/或OOP的开发人员偶然发现这一点,并且知道他们想要实现什么,但不知道具体如何实现

在我的例子中,我使用的是Neo4j,因此对象之间的关系就是对象本身。在处理复杂关联时(“一项活动有三个乐队和一个场馆,提交的表格可能包含新乐队和现有乐队以及场馆的任意组合,以及需要与乐队/场馆对象或它们与活动之间的关系相关联的唯一数据……所有这些数据都通过活动控制器提交”)我发现自己一直处于这些灰色地带,在那里,任务的责任是值得怀疑的。事件的任务是为特定事件设置唯一的频带描述吗?Rails会说是的。它会让我把我的参数发送到活动中,然后活动会延伸到乐队和场地。。。但为什么这项活动的任务是什么?为什么事件要负责与其他对象之间如此多的来回

此外,当一些东西坏了,它有时会成为沃尔多在哪里找到令人不快的代码。它是事件模型吗?乐队模型?再说一次,谁负责连接这些点的整个过程?它们是共同的责任。归根结底,模型是对象的看门人并控制它们的行为,但是模型之间共享信息的看门人是什么呢

Ryan Bates在其网络广播中实现的服务对象是我的救星。事件控制器将表单数据发送到EventManager类。EventManager分离表单,将表单的各个部分发送给其他专门的服务类——VenueManager和BandManager——它们验证数据,然后使用相关模型执行查询和/或在必要时创建新对象。辅助服务类向EventManager返回对象和布尔响应,然后EventManager根据需要设置关系属性。我的行为是孤立的,更容易测试、阅读和扩展

因为管理类是有责任的对象,所以我在每个类中都包含
ActiveModel::Validations
。错误会冒出来,我可以放心,如果流程遇到问题,它会自动退出


任何寻求Ruby OOP建议的人都应该阅读Sandi Metz的文章。阅读和完善对于那些需要打破自学的坏习惯的人来说是一件乐事,或者只是想更好地组织他们的代码。基本的OOP概念让我清楚地认识到,我的管理对象的职责需要与我的Rails模型分开处理。

有什么原因不能创建
EventManger
类并将其放入
app/models
?您的模型就是您的业务逻辑。这就是你的程序的绝大多数应该驻留的地方。