10

回顾一些入门课程,我看到这些术语是单独使用的,但我认为我只了解布局。据我所知,布局是代码的临时部分(例如右侧导航部分、包含广告的 div 或类似内容),部分是部分模板,但什么是模板,它与布局?

如果可能的话,你能给出所有三个相互关系的定义吗?(即模板是......并且有两种,部分和布局......布局是特定类型的模板或任何答案)

如果需要,请更正我的假设...

在使用 pjax 的Railscasts 294中,布局由随机数生成器明确区分,这就是我迷路的原因。

我正在尝试制作一个由 App/Verb/noun 访问的页面,我可以在其中“捕获”或“显示”“照片”、“视频”、“图像”等......(应用程序/捕获/照片或app/captures/videos 或 app/displays/photos 等),并试图根据我“捕获”不同事物的时间只更改一个 div ......我真的不明白我在做什么。

4

3 回答 3

22

我知道这是一个老问题,但我也有同样的疑惑。在指南中,没有明确说明布局和视图之间的区别,也没有明确说明关系。为了增加混淆,术语“模板”通常用于两者。作为 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的真实内容(由您的控制器和模型生成)所在的位置。

希望这可以帮助其他人掌握视图和布局。(我想我应该建议在指南中加入这样的内容。)

于 2015-02-05T09:33:41.833 回答
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

于 2013-01-18T02:25:29.690 回答
1

什么是布局?

(a) 让我们从我们试图解决的问题开始

您的 rails 应用程序上可能有 1000 多个不同的“页面”/视图。所有 1000 个页面/视图共享相同的页眉和页脚。现在假设您必须更改站点的页脚:您必须在 1000 个页面中进行更改!真是一场噩梦:这效率不高。

您可以提取页眉和页脚并将其放置在一个可供所有 1000 个页面使用的 layout.html.erb 文件中。这样:一个地方的 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 应用程序首先呈现布局,然后让步到您要显示的特定视图。现在您可以更改布局并将其传播到所有后续使用该布局的“视图”。

于 2020-07-09T02:04:51.090 回答