模板、局部视图和布局
最后输出的 HTML 由模板、局部视图和布局这三种 Rails 元素组成。下面分别进行简要介绍。
模板
Action View 模板可以用多种方式编写。扩展名是 .erb 的模板文件混合使用 ERB(嵌入式 Ruby)和 HTML 编写,扩展名是 .builder 的模板文件使用 Builder::XmlMarkup 库编写。
Rails 支持多种模板系统,并使用文件扩展名加以区分。例如,使用 ERB 模板系统的 HTML 文件的扩展名是 .html.erb。
ERB 模板
在 ERB 模板中,可以使用 <% %> 和 <%= %> 标签来包含 Ruby 代码。<% %> 标签用于执行不返回任何内容的 Ruby 代码,例如条件、循环或块,而 <%= %> 标签用于输出 Ruby 代码的执行结果。
下面是一个循环输出名称的例子:
<h1>Names of all the people</h1>
<% @people.each do |person| %>
Name: <%= person.name %><br>
<% end %>
局部视图
局部视图模板,通常直接称为“局部视图”,作用是把渲染过程分成多个更容易管理的部分。局部视图从模板中提取代码片断并保存在独立的文件中,然后在模板中重用。
局部视图的名称
在视图中我们使用 render 方法来渲染局部视图:
<%= render "menu" %>
在渲染视图的过程中,上面的代码会渲染 _menu.html.erb 局部视图文件。请注意开头的下划线:局部视图的文件名总是以下划线开头,以便和普通视图文件区分开来,但在引用局部视图时不写下划线。从其他文件夹中加载局部视图文件时同样遵守这一规则:
<%= render "shared/menu" %>
上面的代码会加载 app/views/shared/_menu.html.erb 局部视图文件。
使用局部视图来简化视图
使用局部视图的一种方式是把它们看作子程序(subroutine),也就是把细节内容从视图中移出来,这样会使视图更容易理解。例如:
<%= render "shared/ad_banner" %>
<h1>Products</h1>
<p>Here are a few of our fine products:</p>
<% @products.each do |product| %>
<%= render partial: "product", locals: { product: product } %>
<% end %>
<%= render "shared/footer" %>
在上面的代码中,_ad_banner.html.erb 和 _footer.html.erb 局部视图可以在多个页面中使用。当我们专注于实现某个页面时,不必关心这些局部视图的细节。
间隔模板
可以使用 :spacer_template 选项来指定第二个局部视图(也就是间隔模板),在渲染第一个局部视图(也就是主局部视图)的两个实例之间会渲染这个间隔模板:
<%= render partial: @products, spacer_template: "product_ruler" %>
上面的代码会在两个 _product 局部视图(主局部视图)之间渲染 _product_ruler 局部视图(间隔模板)。