- 浏览: 2050157 次
- 性别:
- 来自: NYC
文章分类
- 全部博客 (628)
- Linux (53)
- RubyOnRails (294)
- HTML (8)
- 手册指南 (5)
- Mysql (14)
- PHP (3)
- Rails 汇总 (13)
- 读书 (22)
- plugin 插件介绍与应用 (12)
- Flex (2)
- Ruby技巧 (7)
- Gem包介绍 (1)
- javascript Jquery ext prototype (21)
- IT生活 (6)
- 小工具 (4)
- PHP 部署 drupal (1)
- javascript Jquery sort plugin 插件 (2)
- iphone siri ios (1)
- Ruby On Rails (106)
- 编程概念 (1)
- Unit Test (4)
- Ruby 1.9 (24)
- rake (1)
- Postgresql (6)
- ruby (5)
- respond_to? (1)
- method_missing (1)
- git (8)
- Rspec (1)
- ios (1)
- jquery (1)
- Sinatra (1)
最新评论
-
dadadada2x:
user模型里加上 protected def email ...
流行的权限管理 gem devise的定制 -
Sev7en_jun:
shrekting 写道var pattern = /^(0| ...
强悍的ip格式 正则表达式验证 -
jiasanshou:
好文章!!!
RPM包rpmbuild SPEC文件深度说明 -
寻得乐中乐:
link_to其实就是个a标签,使用css控制,添加一个参数: ...
Rails在link_to中加参数 -
aiafei0001:
完全看不懂,不知所然.能表达清楚一点?
"$ is not defined" 的问题怎么办
Update: Oct-28-2011
layout的加载和覆盖问题
之前只是明确知道globe级别的layout会被controller级别的layout给覆盖了
实际上controller级别和globe级别的layout也会被share级别或者action级别的layout给覆盖掉
比如,有application layout,有admin layout,在admin controller里写了
那么,其它的action,会没有layout
Layout应该放在app/views/layouts下,我们的文件名是standard.rhtml
上面的代码都是标准html来描述页面,只有两行不是link行是加载css,yield是ruby的块调用,用来输出框架内的内容
controller部分:
打开浏览器访问,我们可以看到如下节目,说明已经加载内容。
然后,添加CSS样式描述到如下目录/public/stylesheets
你应该看到如下,界面是我们要的:
当然,上面的示例是标准用法,也是最普遍的用法。实际上,下面是hideto老大的,详细说明,2007年的相当经典,http://www.rubyeye.com/topic/106623实在于心不忍,所以,转回来啦
一般来说layout有如下五种:
gobal layout,controller layout,shared layout,dynamic layout,action layout
假设我们有一个views/projects/index.rhtml页面:
下面来看看各种layout的用法。
1,global layout
添加views/layouts/application.rhtml:
由于我们的controller都继承自ApplicationController,所以application.rhtml会先解析
2,controller layout
添加views/layouts/projects.rhtml:
道理同上,ProjectsController当然会使用同名的projects.rhtml作layout了
注意的是controller layout会覆盖global layout
3,shared layout
添加views/layouts/admin.rhtml:
我们建立了admin layout,然后在需要使用该layout的controller中指定即可:
4,dynamic layout
有时候我们需要根据不同的用户角色来使用不同的layout,比如管理员和一般用户,比如博客换肤(也可以用更高级的theme-generator)
5,action layout
在action中指定layout即可:
上面的index方法指定使用projects layout,当然我们也可以指定不使用layout,如printable页面:
需要注意的是,这5种layout会按顺序后面的覆盖前面的layout
呵呵,绝对无愧。作为一个新人,我在你这里学到很多东西,还有你分享的电子书,都给我很大帮助。
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
评论
3 楼
tiroc
2011-03-22
夜鸣猪 写道
感谢回复,
受之有愧可还是给我很大鼓励,让我愿意考虑赶紧回到ruby社区
受之有愧可还是给我很大鼓励,让我愿意考虑赶紧回到ruby社区
呵呵,绝对无愧。作为一个新人,我在你这里学到很多东西,还有你分享的电子书,都给我很大帮助。
2 楼
夜鸣猪
2011-03-22
感谢回复,
受之有愧可还是给我很大鼓励,让我愿意考虑赶紧回到ruby社区
受之有愧可还是给我很大鼓励,让我愿意考虑赶紧回到ruby社区
1 楼
tiroc
2011-03-20
感谢夜鸣猪写出这么好的文章
发表评论
-
Destroying a Postgres DB on Heroku
2013-04-24 10:58 890heroku pg:reset DATABASE -
VIM ctags setup ack
2012-04-17 22:13 3215reference ctags --extra=+f --e ... -
alias_method_chain方法在3.1以后的替代使用方式
2012-02-04 02:14 3242alias_method_chain() 是rails里的一个 ... -
一些快速解决的问题
2012-01-19 12:35 1438问题如下: 引用Could not open library ... -
API service 安全问题
2011-12-04 08:47 1343这是一个长期关注的课题 rest api Service的 ... -
Module方法调用好不好
2011-11-20 01:58 1303以前说,用module给class加singleton方法,和 ... -
一个ajax和rails交互的例子
2011-11-19 01:53 1860首先,这里用了一个,query信息解析的包,如下 https: ... -
Rails 返回hash给javascript
2011-11-19 01:43 2239这是一个特别的,不太正统的需求, 因为,大部分时候,ajax的 ... -
关于Rubymine
2011-11-18 23:21 2230开个帖子收集有关使用上的问题 前一段时间,看到半价就买了。想 ... -
ruby中和javascript中,动态方法的创建
2011-11-18 21:01 1194class Klass def hello(*args) ... -
textmate快捷键 汇总
2011-11-16 07:20 8092TextMate 列编辑模式 按住 Alt 键,用鼠标选择要 ... -
Ruby面试系列六,面试继续面试
2011-11-15 05:55 1981刚才受到打击了,充分报漏了自己基础不扎实,不肯向虎炮等兄弟学习 ... -
说说sharding
2011-11-13 00:53 1435这个东西一面试就有人 ... -
rails面试碎碎念
2011-11-12 23:51 1900面试继续面试 又有问ru ... -
最通常的git push reject 和non-fast forward是因为
2011-11-12 23:29 17151git push To git@github.com:use ... -
Rails 自身的many to many关系 self has_many
2011-11-12 01:43 2680简单点的 #注意外键在person上people: id ... -
Rails 3下的 in place editor edit in place
2011-11-12 01:20 913第一个版本 http://code.google.com/p ... -
Heroku 的诡异问题集合
2011-11-11 07:22 1657开个Post记录,在用heroku过程中的一些诡异问题和要注意 ... -
SCSS 和 SASS 和 HAML 和CoffeeScript
2011-11-07 07:52 12902Asset Pipeline 提供了内建 ... -
Invalid gemspec because of the date format in specification
2011-11-07 02:14 2073又是这个date format的错误。 上次出错忘了,记录下 ...
相关推荐
rails 项目起步示例 同新手共同进步
rails_layout, 为各种前端框架生成 Rails 应用程序布局文件 RailsLayout gem使用这里 gem 可以设置你选择的前端框架的布局文件:Zurb基础 5.3Bootstrap 4.0Bootstrap 3.3它还将为 Bootstrap 或者基础设置设计视图。...
基于ruby on rails开发示例源码
sample_app_2nd_ed, Rails 教程示例应用程序 2nd 版 Ruby on Rails 教程:示例应用程序这个仓库已经过期了,而且不再维护。 请查看 Rails 教程帮助页,了解最新版本。 这是 Rails 教程中 ruby的样例应用程序: 学习...
ailsGuides的blog示例网站,手打后亲测。修正了包括coffee JS版本的几个问题。
本文将介绍浅谈Ruby on Rails中的include和extend。include主要用来将一个模块插入到一个类或者其它模块。extend用来在一个对象中引入一个模块,这个类从而也具备了这个模块的方法。
rails-prelaunch-signup, web启动预启动站点的Rails 3.2应用程序示例 Rails 应用程序用于启动预启动注册站点Rails 3.2示例应用程序"测试版即将启动"启动预启动注册站点示例应用程序。Rails 预启动注册应用程序插件...
Ruby on Rails 教程:示例应用程序 这是一个示例应用程序: 。
Ruby on Rails教程:示例应用程序这是的[ Ruby on Rails教程]的示例应用程序。
spine.rails3:演示Spine和Rails集成的示例应用程序
rails-angular-karma-example, 带有 angular.js 和 Karma 测试 runner的示例 Rails 应用 Rails 示例应用中的 Karma 为在 Rails 上创建 Karma 而创建的示例应用程序,描述了如何使用 Rails 为 AngularJS建立 Karma ...
Ruby on Rails的示例API开发 该项目演示了Ruby on Rails上的示例API开发。
这几天一直在学习使用RoR(Ruby on Rails),想建立一个功能全面一点的LBS(Location Based Service)网站。但是对于我这个RoR的初学者(仅有几天时间)来说,毕竟太复杂了。因此本文试图简化原来的设计思路,抛弃一切...
Ruby on Rails实例开发.
Ember CLI 和 Rails 持续集成示例
shoppe-example, 在 Rails 中使用Shoppe平台的示例存储实现 这是一个 Rails 应用程序,它使用 Shoppe 构建。 它具有一个可以爱的设计,以充分演示Shoppe平台提供的功能以及它在 Rails 应用程序中的。 正在启动要开始...
Ruby on Rails教程:示例应用程序这是一个示例应用程序,用于: ( 。