Rails 渲染响应的视图时,会把视图和当前模板结合起来。
1. 查找布局
-
默认布局
查找布局时,Rails首先查看 app/views/layouts
文件夹中是否有和控制器同名的文件(如:PostsController => app/views/layouts/posts.html.erb
),如果没有,则使用app/views/layouts/application.html.erb
-
指定控制器所用布局
class ProductsController < ApplicationController
layout "inventory"
#...
end
这么声明之后,ProductsController
渲染的所有视图都将使用app/views/layouts/inventory.html.erb
文件作为布局。
-
运行时指定布局
class ProductsController < ApplicationController
layout :products_layout
def show
@product = Product.find(params[:id])
end
private
def products_layout
@current_user.special? ? "special" : "products"
end
end
-
条件布局
在控制器中指定布局时可以使用 :only和 :except选项。
class ProductsController < ApplicationController
layout "product", except: [:index, :rss]
end
这么声明后,除了 rss
和index
动作之外,其他动作都使用 product
布局渲染视图。
2. 布局结构
Rails渲染响应的视图时,会把视图和当前模板结合起来,在布局中可使用三种工具把各部分合在一起组成完整的响应:
- 静态资源标签
- yield和content_for
- 局部视图
静态资源标签帮助方法
Rails提供了六个静态资源标签帮助方法:
- auto_discovery_link_tag
- javascript_include_tag
- stylesheet_link_tag
- image_tag
- video_tag
- audio_tag
yield和content_for
在布局中,yield
标明一个区域,渲染的视图会插入这里。
- 只有一个yield,则整个渲染的视图都插在这里
- 多个yield,则需要命名yield以对号入座
<html> <head> <%= yield :head %> ## 具有名字的 yield </head> <body> <%= yield %> </body> </html>
视图的主体会插入未命名的 yield区域。要想在具名 yield区域
插入内容,得使用 content_for
方法。
<% content_for :head do %>
<title>A simple page</title>
<% end %>
<p>Hello, Rails!</p>
局部视图
在视图中渲染局部视图可以使用 render
方法:
<%= render "menu" %>
渲染这个视图时,会渲染名为_menu.html.erb
的文件
局部视图
<%= render partial: "link_area", layout: "graybar" %>
这行代码会使用_graybar.html.erb
布局渲染局部视图_link_area.html.erb
。注意,局部布局的名字也以下划线开头,和局部视图保存在同个文件夹中(不在 layouts
文件夹中)。
网友评论