`
dtrex
  • 浏览: 138328 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

rails :layout 详解(转载)

阅读更多

一般来说layout有如下五种:
gobal layout,controller layout,shared layout,dynamic layout,action layout

假设我们有一个views/projects/index.rhtml页面:
代码

   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:
代码

   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:
代码

   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.  
   4.   def index  
   5.     @projects = Project.find(:all)
   6.   end
   7. end

4,dynamic layout
有时候我们需要根据不同的用户角色来使用不同的layout,比如管理员和一般用户,比如博客换肤(也可以用更高级的theme-generator)
代码

   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即可:
代码

   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页面:
代码

   1. def index
   2.   @projects = Project.find(:all)
   3.   render :layout => false
   4. end

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

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics