`

Rails layout用法示例

阅读更多
Update: Oct-28-2011
layout的加载和覆盖问题
之前只是明确知道globe级别的layout会被controller级别的layout给覆盖了
实际上controller级别和globe级别的layout也会被share级别或者action级别的layout给覆盖掉
比如,有application layout,有admin layout,在admin controller里写了
  layout 'application', :only => [:index]

那么,其它的action,会没有layout


Layout应该放在app/views/layouts下,我们的文件名是standard.rhtml

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html;.
charset=iso-8859-1" />
<meta http-equiv="Content-Language" content="en-us" />
<title>Library Info System</title>
<%= stylesheet_link_tag "style" %>
</head>
<body id="library">
<div id="container">
<div id="header">
<h1>Library Info System</h1>
<h3>Library powered by Ruby on Rails</h3>
</div>
<div id="content">
<%= yield -%>
</div>
<div id="sidebar"></div>
</div>
</body>
</html>



上面的代码都是标准html来描述页面,只有两行不是link行是加载css,yield是ruby的块调用,用来输出框架内的内容

controller部分:
#book_controller.rb

class BookController < ApplicationController
   layout 'standard'#表明我们将要调用standard.rhtml作为layout
   def list
      @books = Book.find(:all)
   end
...................


打开浏览器访问,我们可以看到如下节目,说明已经加载内容。


然后,添加CSS样式描述到如下目录/public/stylesheets

body {
   font-family: Helvetica, Geneva, Arial, sans-serif;
   font-size: small;
   font-color: #000;
   background-color: #fff;
}
a:link, a:active, a:visited {
   color: #CD0000;
}
input { 
   margin-bottom: 5px;
}
p { 
   line-height: 150%;
}
div#container {
   width: 760px;
   margin: 0 auto;
}
div#header {
   text-align: center;
   padding-bottom: 15px;
}
div#content {
   float: left;
   width: 450px;
   padding: 10px;
}
div#content h3 {
   margin-top: 15px;
}
ul#books {
   list-style-type: none;
}
ul#books li {
   line-height: 140%;
}
div#sidebar {
   width: 200px;
   margin-left: 480px;
}
ul#subjects {
   width: 700px;
   text-align: center;
   padding: 5px;
   background-color: #ececec;
   border: 1px solid #ccc;
   margin-bottom: 20px;
}
ul#subjects li {
   display: inline;
   padding-left: 5px;
}


你应该看到如下,界面是我们要的:




当然,上面的示例是标准用法,也是最普遍的用法。实际上,下面是hideto老大的,详细说明,2007年的相当经典,http://www.rubyeye.com/topic/106623实在于心不忍,所以,转回来啦


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

假设我们有一个views/projects/index.rhtml页面:
<h2>Projects</h2>   
<ul>   
<% for project in @projects %>   
  <li><%= project.name %></li>   
<% end %>   
</ul>  

<h2>Projects</h2>
<ul>
<% for project in @projects %>
  <li><%= project.name %></li>
<% end %>
</ul>


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

1,global layout
添加views/layouts/application.rhtml:
<h1>Application Layout!</h1>   
<%= yield %>  

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

2,controller layout
添加views/layouts/projects.rhtml:
<h1>Projects Layout!</h1>   
<%= yield %>  

<h1>Projects Layout!</h1>
<%= yield %>


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

3,shared layout
添加views/layouts/admin.rhtml:
<h1>Admin Layout!</h1>   
<%= yield %>  

<h1>Admin Layout!</h1>
<%= yield %>


我们建立了admin layout,然后在需要使用该layout的controller中指定即可:

class ProjectsController < ApplicationController   
  layout "admin"  
  
  def index    
    @projects = Project.find(:all)   
  end   
end  

class ProjectsController < ApplicationController
  layout "admin"

  def index 
    @projects = Project.find(:all)
  end
end



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

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



5,action layout
在action中指定layout即可:
class ProjectsController < ApplicationController   
  layout :user_layout   
  
  def index   
    @projects = Project.find(:all)   
    render :layout => 'projects'  
  end   
  
  protected  
  
  def user_layout   
    if current_user.admin?   
      "admin"  
    else  
      "application"  
    end   
  end   
end  

class ProjectsController < ApplicationController
  layout :user_layout

  def index
    @projects = Project.find(:all)
    render :layout => 'projects'
  end

  protected

  def user_layout
    if current_user.admin?
      "admin"
    else
      "application"
    end
  end
end


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

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



需要注意的是,这5种layout会按顺序后面的覆盖前面的layout
  • 大小: 14.8 KB
  • 大小: 11.9 KB
分享到:
评论
3 楼 tiroc 2011-03-22  
夜鸣猪 写道
感谢回复,
受之有愧可还是给我很大鼓励,让我愿意考虑赶紧回到ruby社区

呵呵,绝对无愧。作为一个新人,我在你这里学到很多东西,还有你分享的电子书,都给我很大帮助。
2 楼 夜鸣猪 2011-03-22  
感谢回复,
受之有愧可还是给我很大鼓励,让我愿意考虑赶紧回到ruby社区
1 楼 tiroc 2011-03-20  
感谢夜鸣猪写出这么好的文章

相关推荐

    rails 项目起步示例

    本示例"rails项目起步示例"是一个购物系统,非常适合初学者入门学习。 在Rails项目中,我们首先需要了解的是项目的目录结构。一个标准的Rails应用会包含以下关键部分: 1. **app**:应用程序的核心,包括模型...

    rails_layout, 为各种前端框架生成 Rails 应用程序布局文件.zip

    rails_layout, 为各种前端框架生成 Rails 应用程序布局文件 RailsLayout gem使用这里 gem 可以设置你选择的前端框架的布局文件:Zurb基础 5.3Bootstrap 4.0Bootstrap 3.3它还将为 Bootstrap 或者基础设置设计视图。...

    RailsGuides blog示例网站 手打+纠错

    这个"RailsGuides blog示例网站"是基于这些官方指南创建的一个实际运行的博客应用,目的是为了让开发者能够在实践中学习和掌握Rails的知识。 在描述中提到的“手打后亲测”,意味着这个博客示例是通过手动输入代码...

    基于ruby on rails开发示例源码

    本示例源码提供了使用Ruby on Rails进行实际项目开发的具体实践,帮助开发者深入理解Rails的工作原理和最佳实践。 在Rails中,`模型`负责处理数据和业务逻辑,`视图`负责展示用户界面,而`控制器`则作为模型和视图...

    sample_app_2nd_ed, Rails 教程示例应用程序 2nd 版.zip

    sample_app_2nd_ed, Rails 教程示例应用程序 2nd 版 Ruby on Rails 教程:示例应用程序这个仓库已经过期了,而且不再维护。 请查看 Rails 教程帮助页,了解最新版本。 这是 Rails 教程中 ruby的样例应用程序: 学习...

    关于rails学习中分页的示例

    这篇关于“rails学习中分页的示例”的文章可能涵盖了如何在Rails应用中实现分页的详细步骤。 在Rails中,最常用的分页库是`Kaminari`和`WillPaginate`。这里我们将以`Kaminari`为例进行讲解,因为它是近年来更受...

    rails-prelaunch-signup, web启动预启动站点的Rails 3.2应用程序示例.zip

    rails-prelaunch-signup, web启动预启动站点的Rails 3.2应用程序示例 Rails 应用程序用于启动预启动注册站点Rails 3.2示例应用程序"测试版即将启动"启动预启动注册站点示例应用程序。Rails 预启动注册应用程序插件...

    Ruby on Rails实例开发

    Ruby on Rails,简称Rails,是基于Ruby编程语言的一个开源Web应用程序框架,它遵循MVC(模型-视图-控制器)架构模式,旨在提高开发效率和可读性,同时强调“约定优于配置”的原则。在本实例开发中,我们将探讨如何...

    rails-angular-karma-example, 带有 angular.js 和 Karma 测试 runner的示例 Rails 应用.zip

    rails-angular-karma-example, 带有 angular.js 和 Karma 测试 runner的示例 Rails 应用 Rails 示例应用中的 Karma 为在 Rails 上创建 Karma 而创建的示例应用程序,描述了如何使用 Rails 为 AngularJS建立 Karma ...

    使用Ruby on Rails开发LBS网站初探示例代码

    这几天一直在学习使用RoR(Ruby on Rails),想建立一个功能全面一点的LBS(Location Based Service)网站。但是对于我这个RoR的初学者(仅有几天时间)来说,毕竟太复杂了。因此本文试图简化原来的设计思路,抛弃一切...

    Rails项目源代码

    这个Rails项目提供了学习和研究Web开发的机会,特别是对于Ruby on Rails新手,可以通过阅读和理解源代码来提升技能,了解实际应用中Rails的用法。同时,对于有经验的开发者,这个项目也可以作为一个起点,进行二次...

    shoppe-example, 在 Rails 中使用Shoppe平台的示例存储实现.zip

    shoppe-example, 在 Rails 中使用Shoppe平台的示例存储实现 这是一个 Rails 应用程序,它使用 Shoppe 构建。 它具有一个可以爱的设计,以充分演示Shoppe平台提供的功能以及它在 Rails 应用程序中的。 正在启动要开始...

    sample_app_3rd_edition, Ruby on Rails 教程 3rd 版的示例应用程序.zip

    sample_app_3rd_edition, Ruby on Rails 教程 3rd 版的示例应用程序 Ruby on Rails 教程:示例应用程序这是 Rails 教程中 ruby的样例应用程序: 学习网页开发,使用 Rails,由 Michael Hartl 。 如果你在教程中遇到...

    rails3-mongoid-devise, 示例 Rails 3.2应用,带有数据 Mongoid,用于验证.zip

    rails3-mongoid-devise, 示例 Rails 3.2应用,带有数据 Mongoid,用于验证 Rails 4.1有关设计的Rails 4.1示例应用程序,请参见:rails设计有一个用于设计的教程:Rails 设计教程。类似示例和教程这是来自 RailsApps...

    Rails 101 入门电子书

    ### Rails 101 入门电子书知识点详解 #### 一、简介 《Rails 101 入门电子书》是一本非常适合初学者直接入门的书籍,它由xdite编写并出版于2014年6月10日。本书主要针对的是希望学习Ruby on Rails框架的读者,特别...

    sample_app:Ruby on Rails 教程的示例应用程序

    **Ruby on Rails 教程示例应用程序** Ruby on Rails(RoR)是一个基于Ruby语言的开源Web开发框架,它遵循MVC(Model-View-Controller)架构模式,旨在简化Web应用的开发过程并提高开发效率。这个“sample_app”是为...

    关于rails 3.1 cucumber-rails 1.2.0

    总的来说,了解和熟练掌握Rails 3.1和Cucumber-Rails 1.2.0的用法,对于任何希望在Ruby on Rails环境中进行高效、高质量开发的团队来说都是至关重要的。通过阅读相关的博客文章(如给出的链接),开发者可以深入学习...

    learn-rails:Daniel Kehoe 的 Learn Ruby on Rails 教程的示例应用程序

    《深入学习Rails:Daniel Kehoe的Learn Ruby on Rails教程示例应用》 Rails,全称为Ruby on Rails,是一款基于Ruby编程语言的开源Web应用程序框架,遵循MVC(Model-View-Controller)架构模式,旨在简化开发过程并...

    backbone-rails-demo:演示 rails-backbone gem 用法的示例应用程序

    示例用法 创建一个名为 blog 的新 Rails 应用程序。 rails new blog 编辑您的 Gemfile 并添加 gem 'rails-backbone' 安装 gem 并生成脚手架。 bundle install rails g backbone:install rails g scaffold Post...

Global site tag (gtag.js) - Google Analytics