Rails布局(layout)

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

这么声明后,除了 rssindex动作之外,其他动作都使用 product布局渲染视图。

2. 布局结构

Rails渲染响应的视图时,会把视图和当前模板结合起来,在布局中可使用三种工具把各部分合在一起组成完整的响应:

  • 静态资源标签
  • yield和content_for
  • 局部视图
静态资源标签帮助方法

Rails提供了六个静态资源标签帮助方法:

  1. auto_discovery_link_tag
  2. javascript_include_tag
  3. stylesheet_link_tag
  4. image_tag
  5. video_tag
  6. audio_tag
yield和content_for

在布局中,yield标明一个区域,渲染的视图会插入这里。

  • 只有一个yield,则整个渲染的视图都插在这里
  • 多个yield,则需要命名yield以对号入座
    
      
        <%= yield :head %>  ## 具有名字的 yield
      
      
        <%= yield %>
      
    
    

视图的主体会插入未命名的 yield区域。要想在具名 yield区域插入内容,得使用 content_for方法。

  <% content_for :head do %>
    A simple page
  <% end %>
   
  

Hello, Rails!

局部视图

在视图中渲染局部视图可以使用 render方法:

<%= render "menu"  %>

渲染这个视图时,会渲染名为_menu.html.erb的文件

局部视图
<%= render partial: "link_area", layout:  "graybar" %>

这行代码会使用_graybar.html.erb布局渲染局部视图_link_area.html.erb。注意,局部布局的名字也以下划线开头,和局部视图保存在同个文件夹中(不在 layouts文件夹中)。

传递本地变量
渲染集合

你可能感兴趣的:(Rails布局(layout))