<div id="blog_text" class="cnt">一般来说layout有如下五种:<br>gobal layout,controller layout,shared layout,dynamic layout,action layout
假设我们有一个views/projects/index.rhtml页面:<br>代码
1. <h2>projects</h2> <br> 2. <ul> <br> 3. <% for project in @projects %> <br> 4. <li><%= project.name %></li> <br> 5. <% end %> <br> 6. </ul>
<br>下面来看看各种layout的用法。
1,global layout<br>添加views/layouts/application.rhtml:<br>代码
1. <h1>application layout!</h1> <br> 2. <%= yield %>
<br>在layouts目录下添加application.rhtml即可,<%= yield %>即输出我们的projects/index.rhtml页面<br>由于我们的controller都继承自applicationcontroller,所以application.rhtml会先解析
2,controller layout<br>添加views/layouts/projects.rhtml:<br>代码
1. <h1>projects layout!</h1> <br> 2. <%= yield %>
<br>道理同上,projectscontroller当然会使用同名的projects.rhtml作layout了<br>注意的是controller layout会覆盖global layout
3,shared layout<br>添加views/layouts/admin.rhtml:<br>代码
1. <h1>admin layout!</h1> <br> 2. <%= yield %>
<br>我们建立了admin layout,然后在需要使用该layout的controller中指定即可:<br>代码
1. class projectscontroller < applicationcontroller <br> 2. layout "admin" <br> 3. <br> 4. def index <br> 5. @projects = project.find(:all) <br> 6. end <br> 7. end
4,dynamic layout<br>有时候我们需要根据不同的用户角色来使用不同的layout,比如管理员和一般用户,比如博客换肤(也可以用更高级的theme-generator)<br>代码
1. class projectscontroller < applicationcontroller <br> 2. layout :user_layout <br> 3. <br> 4. def index <br> 5. @projects = project.find(:all) <br> 6. end <br> 7. <br> 8. protected <br> 9. <br>10. def user_layout <br>11. if current_user.admin? <br>12. "admin" <br>13. else <br>14. "application" <br>15. end <br>16. end <br>17. end
5,action layout<br>在action中指定layout即可:<br>代码
1. class projectscontroller < applicationcontroller <br> 2. layout :user_layout <br> 3. <br> 4. def index <br> 5. @projects = project.find(:all) <br> 6. render :layout => 'projects' <br> 7. end <br> 8. <br> 9. protected <br> 10. <br> 11. def user_layout <br> 12. if current_user.admin? <br> 13. "admin" <br> 14. else <br> 15. "application" <br> 16. end <br> 17. end <br> 18. end
上面的index方法指定使用projects layout,当然我们也可以指定不使用layout,如printable页面:<br>代码
1. def index <br> 2. @projects = project.find(:all) <br> 3. render :layout => false <br> 4. end
需要注意的是,这5种layout会按顺序后面的覆盖前面的layout
假设我们有一个views/projects/index.rhtml页面:<br>代码
1. <h2>projects</h2> <br> 2. <ul> <br> 3. <% for project in @projects %> <br> 4. <li><%= project.name %></li> <br> 5. <% end %> <br> 6. </ul>
<br>下面来看看各种layout的用法。
1,global layout<br>添加views/layouts/application.rhtml:<br>代码
1. <h1>application layout!</h1> <br> 2. <%= yield %>
<br>在layouts目录下添加application.rhtml即可,<%= yield %>即输出我们的projects/index.rhtml页面<br>由于我们的controller都继承自applicationcontroller,所以application.rhtml会先解析
2,controller layout<br>添加views/layouts/projects.rhtml:<br>代码
1. <h1>projects layout!</h1> <br> 2. <%= yield %>
<br>道理同上,projectscontroller当然会使用同名的projects.rhtml作layout了<br>注意的是controller layout会覆盖global layout
3,shared layout<br>添加views/layouts/admin.rhtml:<br>代码
1. <h1>admin layout!</h1> <br> 2. <%= yield %>
<br>我们建立了admin layout,然后在需要使用该layout的controller中指定即可:<br>代码
1. class projectscontroller < applicationcontroller <br> 2. layout "admin" <br> 3. <br> 4. def index <br> 5. @projects = project.find(:all) <br> 6. end <br> 7. end
4,dynamic layout<br>有时候我们需要根据不同的用户角色来使用不同的layout,比如管理员和一般用户,比如博客换肤(也可以用更高级的theme-generator)<br>代码
1. class projectscontroller < applicationcontroller <br> 2. layout :user_layout <br> 3. <br> 4. def index <br> 5. @projects = project.find(:all) <br> 6. end <br> 7. <br> 8. protected <br> 9. <br>10. def user_layout <br>11. if current_user.admin? <br>12. "admin" <br>13. else <br>14. "application" <br>15. end <br>16. end <br>17. end
5,action layout<br>在action中指定layout即可:<br>代码
1. class projectscontroller < applicationcontroller <br> 2. layout :user_layout <br> 3. <br> 4. def index <br> 5. @projects = project.find(:all) <br> 6. render :layout => 'projects' <br> 7. end <br> 8. <br> 9. protected <br> 10. <br> 11. def user_layout <br> 12. if current_user.admin? <br> 13. "admin" <br> 14. else <br> 15. "application" <br> 16. end <br> 17. end <br> 18. end
上面的index方法指定使用projects layout,当然我们也可以指定不使用layout,如printable页面:<br>代码
1. def index <br> 2. @projects = project.find(:all) <br> 3. render :layout => false <br> 4. end
需要注意的是,这5种layout会按顺序后面的覆盖前面的layout