控制器操作为什么应该调用一个模型方法而不是初始的find或new方法?

7
我在我的模型中几乎所有的“共享”语句都已经使用函数了。问题是当我需要在控制器中使用多个这些函数时,我会遇到以下错误:

控制器操作应调用一个模型方法而不是初始查找或新建

IDE更深入地解释道:

如果控制器操作包含超过一个模型方法调用(即初始.find或.new之后),则此检查会发出警告。建议您在模型类内实现所有业务逻辑,并使用单个方法进行访问。

这是意味着所有的逻辑都应该放在更复杂的模型函数中吗?我曾经认为控制器的工作是调用模型函数并将结果传递给视图。
如果我将模型函数代码放回控制器,一切都能正常工作,但是我将在所有控制器操作中获得代码重复。
那么,这里的正确方法是什么?
1个回答

5
警告消息确实意味着逻辑应该放在单个模型函数中,但不一定是更复杂的函数。为避免模型重复和/或“臃肿模型”问题,您可能需要引入模型依赖的其他类。
是的,控制器的工作是调用模型函数,但仅作为一个薄薄的表层,按照此检查指南,每个控制器操作只对应一个模型函数,除了最初的创建/查找。
我不确定您关于将功能移回上层是否会导致控制器中出现代码重复的评论,因为您始终可以在控制器级别引入共享函数。但再次强调,“薄控制器”和“相当薄的模型”,并根据需要支持类,才是推荐的方法。

那么,在控制器级别定义新模型方法或共享方法的规则是什么?我是Rails的新手,实际上,我在我的控制器中只有默认方法(new/edit/update等)。 - gotqn
我所知道的没有硬性规定,只有“瘦控制器”和“不肥模型”的规则。另外,除了你提到的两种选择之外,还有一种选择是创建一个新类供模型使用,这样你就不需要在控制器或模型中添加额外的方法。 - Peter Alfvin
我来晚了。这让我有点困惑,因为我们不是会通过这种方式增加模型的耦合度吗?难道我们的类不应该尽可能独立,以便在应用程序的不同部分重复使用它们,或者设计成可以插入到另一个应用程序中的方式?如果我们的控制器很薄,而模型方法都在调用其他类的方法,那么这怎么可能呢?难道控制器变得更大,并控制我们如何调用和交互模型的方法不是更好吗? - Kevin Greetham
@PeterAlfvin 你能帮忙吗?这是Rails的特定实现选择吗?我经常有大控制器,以便我的方法易于测试,我的类更可重用,如果我想要改变任何东西,我只需在控制器内部和方法本身更改即可!! - Kevin Greetham

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接