回顾一些入门课程,我看到这些术语是单独使用的,但我认为我只了解布局。据我所知,布局是代码的临时部分(例如右侧导航部分,包含广告的div或类似的东西),部分是部分模板,但什么是模板,它是如何与布局?
如果可能,你能否给出所有三个关系的定义? (即模板是....有两种,部分和布局......布局是特定类型的模板或任何答案)
如果需要,请纠正我的假设......
在使用pjax的Railscasts 294中,布局由随机数生成器明确区分,这就是我迷路的原因。
我正在尝试通过App / Verb / noun访问单个页面,我可以“捕获”或“显示”“照片”,“视频”,“图像”等...(app / capture /照片或应用程序/捕获/视频或应用程序/显示/照片等)我试图根据我“捕获”不同的东西进行一次div更改....我在错误的文字中迷失了,或者我得到了非常接近,但我并不真正理解我在做什么。
答案 0 :(得分:18)
我知道这是一个老问题,但我也想知道同样的问题。在指南中,没有明确解释布局和视图之间的区别,也没有对关系的明确解释。为了增加混淆,术语“模板”#39;通常用于两者。作为90年代编写Smalltalk的人(但是Rails的新手),我深深理解MVC并理解它实现的一些方法 - 所以我的困惑并不在于那部分。关于视图,布局和模板以及它们彼此之间的关系,只有一个缺失的背景。
以下是我如何理解它:
从简单理解和示例开始,以便清楚地了解每个部分的关系和角色:
假设您有一个合同模型和控制器,并且您有一个定义视图的文件: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>
* [这是一个完全人为的例子,因此我可以清楚地了解 view 和 layout 之间的关系。显然,在现实世界中,事物将被建模和表达。 ] *
视图为布局提供输入(内容片段)。 视图用于控制器操作,并相应地命名。 (例如:显示,编辑,索引等)
布局以用于渲染它们的控制器命名。 (例如:应用程序 - 用于ApplicationController,合同 - 用于ContractController,contract_customers_view用于ContractCustomersViewController)
开始纠结的地方是 视图 还可以包含布局信息。有时只有视图文件(没有布局文件)。任何一个都可以用模板语言(如ERb或HAML)编写,因此它们都可以称为模板。
部分实际上就是它所说的:它只是一个可以使用的部分(并希望可以重复使用)。您可以获取视图或布局的部分并重新对其进行重新分析,以便您可以重复使用它 - 现在它是部分。部分的常见用途包括头部,导航部分(包括页眉,页脚等),可以重新考虑可重用性的地方,以及通过将它们用于语义和逻辑部分来改进编码风格和可读性。 (这就是人们把它们比作子程序的原因。)
另一个你可以获得关于视图和布局的上下文以及它们如何不同的地方是在ActionView实际生成输出的步骤(流程)中 - 使用所有这些部分呈现内容。例如,了解何时(或不创建)布局非常重要,这样您就可以了解在特定时间您可以使用哪些变量和参数。 (我正在使用Rails 4,顺便说一下。)
鉴于所有这些,现在想象您的所有布局信息都在您的视图中,并且您的视图以模板语言(ERb,HAML等)编写,并且您已经使用了部分内容让一切都唱得更好。您的应用程序中可能没有任何布局文件,其中包含大yield
的实际内容(由控制器和模型生成)。
希望这有助于其他人掌握视图和布局。 (我想我应该建议在指南中加入这样的东西。)
答案 1 :(得分:2)
来自http://www.tutorialspoint.com/ruby-on-rails/rails-layouts.htm:布局定义HTML页面的周围环境。这是定义最终输出的常见外观的地方。布局文件位于app / views / layouts中。
模板是视图文件的通用术语。视图模板 - 驻留在app / views /文件夹中 - 将在布局中呈现。
了解Rails视图如何工作的最佳资源是关于布局和渲染的Ruby on Rails指南页面:http://guides.rubyonrails.org/layouts_and_rendering.html
答案 2 :(得分:1)
您的Rails应用程序上可能有数千个不同的“页面” /视图。这些页面/视图中的所有1000个共享相同的页眉和页脚。现在想象一下,您必须更改站点的页脚:您将必须在1000页中进行更改!噩梦:这没有效率。
您可以提取页眉和页脚并将其放置在layout.html.erb文件中,该文件可用于所有1000页。通过这种方式:在一个地方进行1次更改可以传播到所有1000个视图/页面。因此,如果您想更改页眉/页脚,只需在一个位置进行更改,该更改将应用于使用该相关模板的所有视图。
# example of a layout
# app/views/layouts/application.html.erb
<!DOCTYPE html>
<-- THIS IS SIMPLIFIED - DO NOT COPY this example -->
<html>
<div>
<%= yield %> <-- Notice the yield statement -->
</div>
</html>
# example of a view:
# users#show.html.erb
<-- This uses the application.html.erb layout -->
<-- Notice how I don't have to create a html tag - because this has already been created in the application.html.erb -->
<div class="container">
<h1> About <%= @user.full_name %> </h1>
<br>
<p>
<b> Name: </b> <%= @user.full_name %>
</p>
<p>
<b> Organisation: </b> <%= @organisation.name %>
</p>
<p>
<b> Email: </b> <%= @user.email %>
</p>
</div>
rails应用程序首先呈现布局,然后屈服于要显示的特定视图。现在,您可以更改布局,并将其推广到所有随后使用该布局的“视图”。