回顾一些入门课程,我看到术语是分开使用的,但我想我只理解布局。据我所知,布局是代码的临时部分(如右导航部分,包含广告的div,或类似的东西),部分是部分模板,但什么是模板,它与布局有什么不同?
如果可能的话,你能给出这三者之间的关系的定义吗?(即模板是....有两种,局部和布局....布局是特定类型的模板或其他答案)
如果需要,请纠正我的假设…
在使用pjax的Railscasts 294中,布局由随机数生成器显式区分,这就是为什么我迷路了。
我试图通过App/动词/名词访问单个页面,在那里我可以"捕捉"或"显示"照片","视频","图像"等…(app/捕获/照片或app/捕获/视频或app/显示/照片等),我试图根据我"捕获"不同的东西....做一个div更改我在冗长的语言中迷失了方向,或者我离得很近,但却不明白我在做什么。
我知道这是一个古老的问题,但我也想知道。在指南中,没有明确解释布局和视图之间的区别,也没有明确解释它们之间的关系。更令人困惑的是,术语"模板"经常用于这两种情况。作为一个在90年代编写Smalltalk的人(但对Rails是新手),我深刻理解MVC,并理解它的许多实现方式——所以我的困惑并不在于这一部分。只是缺少关于视图、布局和模板以及它们如何相互关联的上下文。
我是这样理解它的:
从一个简化的理解和例子开始,这样每个部分的关系和作用就很清楚了:
- a view是'要显示的东西',用于特定控制器响应一个动作(这使它进入特定状态)。视图是您的模型在特定状态下的快照,用于特定的操作(原因/上下文)。这是关于信息和状态,不一定是"好看"。
- 一个布局有关于如何显示内容的特定信息。它可能有标记(CSS, HTML等),提供如何组织内容的说明(这部分在这里,那部分在那里,这些在底部,这些在顶部浮动;这是导航信息,这是H1,这是H3,这是一个定义…)以及它的外观(左,右,上,下,红,绿,强调,闪烁,隐藏,大,小,Helvetica等)。认为" L ayout和 L 的书好"
假设你有一个契约模型和控制器,你有一个定义视图的文件: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 %>
你的layout文件应该有更多关于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>
*[这是一个完全人为的例子,所以我可以使视图和布局之间的关系清晰。显然,在现实世界中,事物的建模和表达方式会有所不同。] *
视图为布局提供输入(内容块)。视图用于控制器操作,并相应地命名。(例如:显示、编辑、索引等)布局是以用来呈现它们的控制器命名的。(例如:application——用于ApplicationController, contract——用于ContractController, contract_customers_view——用于ContractCustomersViewController)
在视图中也可以包含布局信息时,它开始变得混乱。有时只有视图文件(没有布局文件)。其中任何一个都可以用模板语言(如ERb或HAML)编写,因此它们都可以被称为模板。A partial就是它所说的:它只是一个可以使用(并且希望被重用)的部分。你可以把部分的视图或布局,并重新因子,以便你可以重用它——现在它是一个部分。部分的常见用途包括头部部分、导航部分(包括页眉、页脚等)、可以重构可重用性的地方,以及通过将它们用于语义和逻辑部分来改进编码风格和可读性。(这就是为什么人们把它们比作子程序。)
另一个你可以得到一些关于视图和布局的上下文,以及它们是如何不同的地方是在步骤(流)中,ActionView通过实际产生输出——使用所有这些部分渲染一些东西。例如,了解何时创建(或不创建)布局是很重要的,这样您就可以了解在特定时间哪些变量和参数可用或不可用。(我正在使用Rails 4,顺便说一下)
考虑到所有这些,现在想象一下,所有的布局信息都在视图中,并且视图是用模板语言(ERb, HAML等)编写的,并且您已经使用了偏奏来使所有内容都更好。你可能没有任何布局文件,除了一个主要的应用程序,其中有一个大的yield
,其中的实际内容(由你的控制器生成&模型)。
希望这有助于其他人得到视图和布局的处理。(我想我应该建议在参考线中加入这样的内容。)
From http://www.tutorialspoint.com/ruby-on-rails/rails-layouts.htm:布局定义了HTML页面的环境。这是定义最终输出的常见外观和感觉的地方。布局文件驻留在app/views/layouts中。
模板是视图文件的通用术语。视图模板-驻留在app/views/folder中-将在布局中呈现。
了解Rails视图如何工作的最佳资源是Ruby on Rails指南页面上的布局和渲染:http://guides.rubyonrails.org/layouts_and_rendering.html
什么是布局?
(a)让我们从我们正试图解决的问题开始吧
你可能有1000个不同的"页"/视图在你的rails应用程序。所有这1000个页面/视图共享相同的页眉和页脚。现在想象一下,您必须更改站点的页脚:您必须在1000页中进行更改!真是个噩梦:这是没有效率的。
您可以提取页眉和页脚,并将其放在一个layout.html.erb文件中,该文件可以被所有1000个页面使用。通过这种方式:一个地方的一个更改可以传播到所有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应用程序首先呈现布局,然后生成你想要显示的特定视图。现在你可以改变布局,让它延伸到你所有的后续视图。