请肯定回答,用 要把这个放在这里,而不是 不要把那个放在那里。
MVC
控制器(Controller):在这里放置与用户需求有关的代码,并决定要给他们什么,确定他们是否已登录,是否应该看到某些数据等。最终,控制器查看请求并确定要显示哪些数据(模型)和渲染哪些视图。如果您对代码是否应该放在控制器中有疑问,那么它可能不应该放在那里。保持您的控制器skinny。
视图(View):视图应只包含最少量的代码来显示数据(模型),它不应执行大量处理或计算,它应该显示由模型计算(或汇总)或由控制器生成的数据。如果您的视图确实需要执行无法由模型或控制器完成的处理,请将代码放在Helper中。视图中的大量Ruby代码使页面标记难以阅读。
模型(Model):您的模型应该是所有与数据相关的代码(构成您网站的实体,例如用户、帖子、帐户、朋友等)所在的地方。如果代码需要保存、更新或汇总与实体相关的数据,请将其放在此处。它将在您的视图和控制器中可重复使用。
补充pauliephonic的回答:
Helper:功能函数,使视图创建更加容易。例如,如果您经常迭代一个小部件列表来显示其价格,请将其放入助手中(以及实际显示的部分)。或者,如果您有一段不想混杂在视图中的RJS代码,请将其放入助手中。
MVC模式实际上只涉及UI,不牵扯其他内容。你不应该在控制器(controller)中添加任何复杂的业务逻辑,因为它只控制视图而不是逻辑。控制器应关注于选择正确的视图并将更复杂的内容委托给领域模型(Model)或业务层。
领域驱动设计(Domain Driven Design)有一个称为服务(Services)的概念,那是您放置需要编排许多不同类型对象的逻辑的地方,通常意味着不自然归属于模型类(Model class)的逻辑。
我通常认为服务层(Service layer)是我的应用程序的API。我的服务层通常与我正在创建的应用程序的需求非常接近,因此服务层作为更低级别的应用程序中找到的更复杂交互的简化,也就是说,您可以跳过服务层完成相同的目标,但是要使其正常工作,必须操作更多的杠杆。
请注意,这里我不是在谈论Rails,而是在谈论解决您特定问题的一般架构风格。
这里已经有完美的解释了,一个非常简单的句子作为结论并且容易记住:
我们需要 SMART 模型、THIN 控制器和 DUMB 视图。
一个有助于正确分离的方法是避免“从控制器传递本地变量到视图”的反模式。而不是这样:
# app/controllers/foos_controller.rb:
class FoosController < ApplicationController
def show
@foo = Foo.find(...)
end
end
#app/views/foos/show.html.erb:
...
<%= @foo.bar %>
...
# app/controllers/foos_controller.rb:
class FoosController < ApplicationController
helper_method :foo
def show
end
protected
def foo
@foo ||= Foo.find(...)
end
end
#app/views/foos/show.html.erb:
...
<%= foo.bar %>
...
foo
和@foo
的作用域是相同的 - 它们都被限定在<ControllerClass,request>对中。此外,通过使用getter版本,我可以更改如何找到/存储/缓存Foo
对象,而不更改视图访问它的方式。 - James A. Rosen嗯,这在某种程度上取决于逻辑需要处理的内容...
通常情况下,将更多的东西推入你的模型中,让控制器保持简单是有意义的。这确保了该逻辑可以轻松地从任何需要访问所表示模型数据的地方使用。视图应该几乎不包含逻辑。因此,总的来说,你应该努力使其不重复自己。
此外,快速搜索一下谷歌就会发现一些更具体的例子。
模型:验证要求、数据关系、创建方法、更新方法、删除方法、查找方法(请注意,你不仅应该拥有这些方法的通用版本,而且如果有一些你经常做的事情,比如按姓氏查找红头发的人,那么你应该提取该逻辑,这样你只需调用find_redH_by_name("smith")之类的方法即可)
视图:应该全部关注数据格式化,而不是数据处理。
控制器:这是数据处理的地方。来自互联网的解释:“控制器的目的是响应用户请求的操作,获取用户设置的任何参数,处理数据,与模型交互,然后将请求的数据以最终形式传递给视图。”
希望这能有所帮助。
测试,测试... 尽可能将逻辑放在模型中,然后您将能够正确地测试它。单元测试通过测试模型来测试数据及其形成方式,功能测试通过测试控制器来测试路由或控制方式,因此,除非数据在模型中,否则无法测试数据的完整性。
j