RailsCasts中文版,#7 All About Layouts 頁面關聯佈局文件

這次咱們聊聊頁面佈局文件。佈局文件其實也是一個頁面,用來定義一些公共的或者框架的頁面結構。普通的頁面文件再嵌入到佈局文件預留的空間中來形成整個頁面的樣子。佈局文件是可以在各個頁面之間公用的公共資源。

全局範圍佈局文件

下面的頁面列出所有的項目名稱

<h2>Projects</h2>
<ul>
<% for project in @projects %>
    <li><%= project.name %></li>
<% end %>
</ul>

這是一個普通頁面:


比如說,我們想爲這個站點的每一個頁面都增加一個頁首、圖標、導航菜單欄,就應該使用佈局文件。佈局文件的標準存放位置在/app/view/layouts目錄。在其中創建一個名爲application.rhtml[1]的應用全局佈局文件。這個文件的佈局規則將會作用域所有的控制器和頁面請求中。我們把佈局文件定義成:

<h1>Application Layout!</h1>
<%= yield %>

請注意第二行,yield告訴佈局文件說在這裏應該是插入應用了這個佈局文件的頁面內容。重新刷新後可以看出,定義的佈局已經生效了。


這麼着定義的佈局文件是全局範圍的,將會作用於所有的頁面上。實際應用中肯定還不能這麼粗狂,還得定義一些特定於不同類型頁面的佈局文件。

特定於控制器的佈局文件

通過把控制器的名稱指定給佈局文件,來將佈局文件和控制器關聯。這樣一來,這個佈局文件就會作用到所有指向這個控制器頁面。比如說,在layouts目錄建立一個projects.rhtml[2]文件意味着這個佈局只在Project對應的控制器生效。

<h1>Project Layout!</h1>
<%= yield %>

如果好幾個控制器想共享一個佈局文件該怎麼辦呢?比如說,我想共享名字叫admin的那個佈局文件。那就在控制器代碼中明確指定吧:

class ProjectsController < ApplicationController
  layout "admin"

  def index
    @projects = Project.find(:all)
  end
end

在控制器中通過layout方法指定的佈局文件會覆蓋通過文件名字規則指定的佈局定義。

動態指定佈局文件

也可以動態關聯佈局文件,比如說我們只是想讓用戶登錄之後再讓頁面關聯名爲admin的佈局文件。可以通過給layout方法傳遞參數的方式實現;定義一個與參數名相同的方法,方法邏輯中計算在什麼時候應該使用哪個名字的佈局文件即可。

class ProjectsController < ApplicationController
  layout :user_layout

  def index
    @projects = Project.find(:all)
  end

  protected
  def user_layout
    if current_user.admin?
      "admin"
    else
      "application"
    end
  end
end

通過render方法,可以更加精細地設定哪個控制器的那個請求使用哪個佈局文件。

def index
  @projects = Project.find(:all)
  render :layout => 'projects'
end

通過render方法指定的佈局文件會覆蓋控制器關聯佈局文件的定義。想清空佈局關聯可以使用:

render :layout => false

注:

  1. 在Rails2及以後版本,佈局文件命名按照application.html.erb的規則
  2. 在Rails2及以後版本,佈局文件命名按照.html.erb

作者授權:Your welcome to post the translated text on your blog as well if the episode is free(not Pro). I just ask that you post a link back to the original episode on railscasts.com.

原文鏈接:http://railscasts.com/episodes/7-all-about-layouts

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章