Rails:将一个动作分成几个部分

时间:2016-09-28 14:48:08

标签: ruby-on-rails

说我正在我的控制器中写一个动作。

虽然它有很多逻辑:几个if语句,也有案例。

有没有办法可以对这些逻辑进行分组,例如,我希望所有if语句都在一个文件中,case语句在另一个文件中。所以在我的控制器中,我不必编写大量代码,我只需调用包含这些语句的文件即可。与HTML中一样,我们使用script标记来包含JS个文件

也许其他行动也可以在将来使用这些文件。

2 个答案:

答案 0 :(得分:1)

您的控制器的操作不应包含该数量的业务逻辑。有许多潜在的解决方案:

  • 您可以使用model concerns在模型中共享逻辑,将逻辑移动到模型层中

  • 将您的操作逻辑提炼为多种可重复使用的方法,并将这些方法移到ApplicationController中,以便任何继承自ApplicationController的控制器可以重用这些方法。

  • 介绍一个controller concern,其中包含嵌入方法的相关逻辑,以及需要访问逻辑的控制器中的 include

稍微远离内置的Rails约定,您可以引入一层" service"您可以实例化以保存可重用的业务逻辑blob的对象,这些逻辑不一定适合您的模型层。

这些通常被称为"服务"或"操作",分别驻留在app/servicesapp/operations。在代码结构方面,这些是简单的类,它接受来自控制器的输入,在模型层上执行复杂的操作,然后使输出可用于控制器,以便可以将其呈现给用户。

在名为TrailBlazer的项目中定义了一组额外的Rails约定,这些约定可能是一个有用的模板,可以在其上建模您自己的服务/操作层。

答案 1 :(得分:0)

我们不知道控制器中的确切逻辑,但通常将逻辑包含在其中是一种不好的做法。您应该委托模型中的所有业务逻辑。

从您的控制器中,您应该只处理与HTTP相关的事情,并委托给正确的模型。

假设这个方法不适合您,您也可以使用ActiveRecord Concerns,它们对DRY非常有用,允许您包含可重用代码的小片段

如果这甚至不符合您的要求,您可以在.rb中放置一些app_folder/lib个文件,它们通常会自动加载,而您并不需要手动

如果您发布控制器的代码,这将非常有用,这将使我们更好地了解您正在尝试做什么