主题:Rails宝典之第七式: layout详解

来源:互联网 发布:nginx server配置 编辑:程序博客网 时间:2024/06/09 22:31
这次的视频很有用,详细解释了layout的用法 
一般来说layout有如下五种: 
gobal layout,controller layout,shared layout,dynamic layout,action layout 

假设我们有一个views/projects/index.rhtml页面: 
Java代码  收藏代码
  1. <h2>Projects</h2>  
  2. <ul>  
  3. <% for project in @projects %>  
  4.   <li><%= project.name %></li>  
  5. <% end %>  
  6. </ul>  

下面来看看各种layout的用法。 

1,global layout 
添加views/layouts/application.rhtml: 
Java代码  收藏代码
  1. <h1>Application Layout!</h1>  
  2. <%= yield %>  

在layouts目录下添加application.rhtml即可,<%= yield %>即输出我们的projects/index.rhtml页面 
由于我们的controller都继承自ApplicationController,所以application.rhtml会先解析 

2,controller layout 
添加views/layouts/projects.rhtml: 
Java代码  收藏代码
  1. <h1>Projects Layout!</h1>  
  2. <%= yield %>  

道理同上,ProjectsController当然会使用同名的projects.rhtml作layout了 
注意的是controller layout会覆盖global layout 

3,shared layout 
添加views/layouts/admin.rhtml: 
Java代码  收藏代码
  1. <h1>Admin Layout!</h1>  
  2. <%= yield %>  

我们建立了admin layout,然后在需要使用该layout的controller中指定即可: 
Java代码  收藏代码
  1. class ProjectsController < ApplicationController  
  2.   layout "admin"  
  3.   
  4.   def index   
  5.     @projects = Project.find(:all)  
  6.   end  
  7. end  


4,dynamic layout 
有时候我们需要根据不同的用户角色来使用不同的layout,比如管理员和一般用户,比如博客换肤(也可以用更高级的theme-generator
Java代码  收藏代码
  1. class ProjectsController < ApplicationController  
  2.   layout :user_layout  
  3.   
  4.   def index  
  5.     @projects = Project.find(:all)  
  6.   end  
  7.   
  8.   protected  
  9.   
  10.   def user_layout  
  11.     if current_user.admin?  
  12.       "admin"  
  13.     else  
  14.       "application"  
  15.     end  
  16.   end  
  17. end  


5,action layout 
在action中指定layout即可: 
Java代码  收藏代码
  1. class ProjectsController < ApplicationController  
  2.   layout :user_layout  
  3.   
  4.   def index  
  5.     @projects = Project.find(:all)  
  6.     render :layout => 'projects'  
  7.   end  
  8.   
  9.   protected  
  10.   
  11.   def user_layout  
  12.     if current_user.admin?  
  13.       "admin"  
  14.     else  
  15.       "application"  
  16.     end  
  17.   end  
  18. end  

上面的index方法指定使用projects layout,当然我们也可以指定不使用layout,如printable页面: 
Java代码  收藏代码
  1. def index  
  2.   @projects = Project.find(:all)  
  3.   render :layout => false  
  4. end  


需要注意的是,这5种layout会按顺序后面的覆盖前面的layout 

关于erb和capture的文章:http://hideto.iteye.com/blog/97353
原创粉丝点击