我知道这是一个老问题,但我也有同样的疑惑。在指南中,没有明确说明布局和视图之间的区别,也没有明确说明关系。为了增加混淆,术语“模板”通常用于两者。作为 90 年代编程 Smalltalk 的人(但对 Rails 不熟悉),我深刻理解 MVC 并理解实现它的许多方式中的一些——所以我的困惑不在于那部分。关于视图、布局和模板以及它们如何相互关联,只缺少一部分上下文。
我是这样理解的:
从一个简单的理解和例子开始,这样每个部分的关系和作用就清楚了:
- 视图是特定控制器响应动作(将其置于特定状态)的“要显示的东西” 。视图是您的模型在特定状态下针对特定操作(原因/上下文)的快照。它与信息和状态有关,不一定与“看起来不错”有关。
- 布局具有有关如何显示某些内容的特定信息。它可能有标记(CSS、HTML 等),提供有关如何组织某物的说明(这里的部分在上面,那里的部分,那些在底部,这些在顶部浮动;那是导航信息,这是 H1,那是 H3,这是一个定义..)以及它的外观(左、右、上、下、红色、绿色、强调、闪烁、隐藏、大、小、Helvetica 等)想想“布局”看起来不错”
假设您有一个 Contract 模型和控制器,并且您有一个定义视图的文件view/contracts/show.htm.erb
:
<% content_for :full_identification do %>
<p><%= contract.display_name %> <%=contract.full_id_number %> </p>
<% end %>
<% content_for :summary do %>
<p> This is the summary for <%= contract.simple_name %>. You hire us. We give you coolness. You pay us.</p>
<% end %>
<% content_for :client_info do %>
<div class="client-info">
<p><span class="contract-title">Client: <%= contract.client_name%></span></p>
<p>Address: <%= contract.client_address%></p>
<p>Phone: <%= contract.client_phone %> </p>
... more info about the client....
</div>
<% end %>
<% content_for :scope_of_work_statement do %>
<p class="scope-of-work-statement"><%= contract.scope_of_work%>:</p>
<% end %>
您的布局文件将包含有关 HTML 的更多详细信息(假设为 HTML 输出)以及有关您希望事物外观的详细信息。也许您有一个控制器和视图,它特定于客户端查看该合同的内容(以及方式)。你有一个特定控制器的布局文件,它看起来像这样:
layouts/contracts/contracts_clients_view.htm.erb
<div class="tab-pane fade in" >
<div class="span7 highlight >
<%= yield :full_identification %>
<div class="no-breaks reflow" >
<%= yield :summary%>
</div>
</div>
<div class="span5 scope-of-work-statement">
<h3>Scope of Work Statement</h3>
<%= yield :scope_of_work_statement %>
</div>
</div>
</div>
*[这是一个完全人为的例子,以便我可以清楚地说明视图和布局之间的关系。显然,在现实世界中,事物的建模和表达方式会有所不同。]*
视图为布局提供输入(内容片段)。视图用于控制器操作并相应命名。(例如:显示、编辑、索引等)
布局以用于渲染它们的控制器命名。(例如:应用程序 - 用于 ApplicationController,合同 - 用于 ContractController,contract_customers_view - 用于 ContractCustomersViewController)
它开始纠结的地方是视图 中也可以包含布局信息。有时只有视图文件(没有布局文件)。并且任何一个都可以用模板语言(如 ERb 或 HAML)编写,因此它们都可以称为模板。
部分实际上就是它所说的:它只是一个可以使用(并希望重复使用)的片段。您可以获取视图或布局的一部分并对其进行重构,以便您可以重新使用它——现在它是部分. 部分的常见用途包括标题部分、导航部分(包括页眉、页脚等)、可以重构以实现可重用性的地方,以及通过将它们用于语义和逻辑部分来改进编码风格和可读性。(这就是为什么人们把它们比作一个子程序。)
另一个您可以获得有关视图和布局的上下文以及它们有何不同之处的地方是 ActionView 实际生成输出所经历的步骤(流程)——使用所有这些部分渲染某些东西。例如,了解何时创建(或未创建)布局很重要,这样您就可以了解在特定时间哪些变量和参数对您可用或不可用。
(顺便说一句,我正在使用 Rails 4。)
考虑到所有这些,现在想象所有布局信息都在您的视图中,并且您的视图是用模板语言(ERb、HAML 等)编写的,并且您使用了部分来使所有内容都更好听。除了一个主要的布局文件之外,您可能没有任何布局文件用于您的应用程序,其中有一个很大yield
的真实内容(由您的控制器和模型生成)所在的位置。
希望这可以帮助其他人掌握视图和布局。(我想我应该建议在指南中加入这样的内容。)