這次咱們聊聊頁面佈局文件。佈局文件其實也是一個頁面,用來定義一些公共的或者框架的頁面結構。普通的頁面文件再嵌入到佈局文件預留的空間中來形成整個頁面的樣子。佈局文件是可以在各個頁面之間公用的公共資源。
全局範圍佈局文件
<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
注:
- 在Rails2及以後版本,佈局文件命名按照
application.html.erb
的規則 - 在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.