说我正在我的控制器中写一个动作。
虽然它有很多逻辑:几个if语句,也有案例。
有没有办法可以对这些逻辑进行分组,例如,我希望所有if
语句都在一个文件中,case
语句在另一个文件中。所以在我的控制器中,我不必编写大量代码,我只需调用包含这些语句的文件即可。与HTML
中一样,我们使用script
标记来包含JS
个文件
也许其他行动也可以在将来使用这些文件。
答案 0 :(得分:1)
您的控制器的操作不应包含该数量的业务逻辑。有许多潜在的解决方案:
您可以使用model concerns在模型中共享逻辑,将逻辑移动到模型层中
将您的操作逻辑提炼为多种可重复使用的方法,并将这些方法移到ApplicationController
中,以便任何继承自ApplicationController
的控制器可以重用这些方法。
介绍一个controller concern,其中包含嵌入方法的相关逻辑,以及需要访问逻辑的控制器中的 include 。
稍微远离内置的Rails约定,您可以引入一层" service"您可以实例化以保存可重用的业务逻辑blob的对象,这些逻辑不一定适合您的模型层。
这些通常被称为"服务"或"操作",分别驻留在app/services
和app/operations
。在代码结构方面,这些是简单的类,它接受来自控制器的输入,在模型层上执行复杂的操作,然后使输出可用于控制器,以便可以将其呈现给用户。
在名为TrailBlazer的项目中定义了一组额外的Rails约定,这些约定可能是一个有用的模板,可以在其上建模您自己的服务/操作层。
答案 1 :(得分:0)
我们不知道控制器中的确切逻辑,但通常将逻辑包含在其中是一种不好的做法。您应该委托模型中的所有业务逻辑。
从您的控制器中,您应该只处理与HTTP相关的事情,并委托给正确的模型。
假设这个方法不适合您,您也可以使用ActiveRecord Concerns,它们对DRY非常有用,允许您包含可重用代码的小片段
如果这甚至不符合您的要求,您可以在.rb
中放置一些app_folder/lib
个文件,它们通常会自动加载,而您并不需要手动
如果您发布控制器的代码,这将非常有用,这将使我们更好地了解您正在尝试做什么