Rails的模板

CharlesCui發表於2007-11-14
一般來說layout有如下五種:
gobal layout,controller layout,shared layout,dynamic layout,action layout

假設我們有一個views/projects/index.rhtml頁面:

程式碼
  1. <h2>Projectsh2>
  2. <ul>
  3. <% for project in @projects %>
  4. <li><%= project.name %>li>
  5. <% end %>
  6. ul>

下面來看看各種layout的用法。

1,global layout
新增views/layouts/application.rhtml:

程式碼
  1. <h1>Application Layout!h1>
  2. <%= yield %>

在layouts目錄下新增application.rhtml即可,即輸出我們的projects/index.rhtml頁面
由於我們的controller都繼承自ApplicationController,所以application.rhtml會先解析

2,controller layout
新增views/layouts/projects.rhtml:

程式碼
  1. <h1>Projects Layout!h1>
  2. <%= yield %>

道理同上,ProjectsController當然會使用同名的projects.rhtml作layout了
注意的是controller layout會覆蓋global layout

3,shared layout
新增views/layouts/admin.rhtml:

程式碼
  1. <h1>Admin Layout!h1>
  2. <%= yield %>

我們建立了admin layout,然後在需要使用該layout的controller中指定即可:
程式碼
  1. class ProjectsController < ApplicationController
  2. layout "admin"
  3. def index
  4. @projects = Project.find(:all)
  5. end
  6. end

4,dynamic layout
有時候我們需要根據不同的使用者角色來使用不同的layout,比如管理員和一般使用者,比如部落格換膚(也可以用更高階的)

程式碼
  1. class ProjectsController
  2. layout :user_layout
  3. def index
  4. @projects = Project.find(:all)
  5. end
  6. protected
  7. def user_layout
  8. if current_user.admin?
  9. "admin"
  10. else
  11. "application"
  12. end
  13. end
  14. end

5,action layout
在action中指定layout即可:

程式碼
  1. class ProjectsController
  2. layout :user_layout
  3. def index
  4. @projects = Project.find(:all)
  5. render :layout => 'projects'
  6. end
  7. protected
  8. def user_layout
  9. if current_user.admin?
  10. "admin"
  11. else
  12. "application"
  13. end
  14. end
  15. end

上面的index方法指定使用projects layout,當然我們也可以指定不使用layout,如printable頁面:
程式碼
  1. def index
  2. @projects = Project.find(:all)
  3. render :layout => false
  4. end

需要注意的是,這5種layout會按順序後面的覆蓋前面的layout

[@more@]

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/9934490/viewspace-982393/,如需轉載,請註明出處,否則將追究法律責任。

相關文章