- 浏览: 274807 次
- 性别:
- 来自: 尤溪
文章分类
最新评论
-
palytoxin:
我现在也发现是这样
关于分享 -
float2net:
Java社区,分享有利于提高。
关于分享 -
hz_qiuyuanxin:
头晕啊,啊邱
RSpec学习笔记 -
reyesyang:
...
关于分享 -
Hooopo:
一般实现map都先实现each
在 Ruby 中对树状结构(tree)进行 map 操作
参考链接:http://guides.rubyonrails.org/layouts_and_rendering.html#structuring-layouts
layout
layout最基本的使用很简单,默认的layout是app/views/layout目录里与controller同名的模板。如果要指定为其它布局,可以在controller里调用layout方法,像这样:
之后,所有的action都将以app/views/layout/inventory.html.erb为布局来渲染模板。layout方法还支持:except和:only两个选项,用来选择layout方法影响到的action,顾名思义吧,不记了。
动态布局
当layout方法的参数为一个symbol的时候,这个controller的布局是动态的,必须在controller里定义一个与symbol对应的方法(一般为private即可),这个方法必须返回一个字符串,用作指定布局的名字:
也可以这样写:
结构化布局(Structuring Layouts)
Asset Tags
javascript_include_tag
在页面中引入js文件:public/javascripts/main.js:
引入public/javascripts/main.js 和 public/javascripts/columns.js:
引入public/javascripts/main.js 和 public/photos/columns.js:
引入http://example.com/main.js:
:defaults 选项可用于引入Prototype 和 Scriptaculous 库:
:all 选项加载public/javascripts目录下的每个js文件, 以Prototype 和 Scriptaculous开头:
:recursive 选项用于指定是否包含public/javascripts目录的子目录中的js文件:
如果你加载了多个js文件,可以通过设置:catch选项为true来组合多个js文件到一个js文件中,从而增强用户体验。 :
默认的,这些js文件将被组合到javascripts/all.js中。你可以手动指定一个缓存文件的位置:
甚至可以使用动态的路径,像这样:cache/#{current_site}/main/display.
stylesheet_link_tag
stylesheet_link_tag的使用大致和javascript_include_tag相同,只是没有那个:defaults选项。另外,stylesheet_link_tag多了:media、:rel和:type三个选项,用于指定stylesheet link的media、rel和type值,默认值为:media="screen" rel="stylesheet" type="text/css"。
layout中的yield
在layout里面,yield用来标识view应该插入的地方。像这样:
带参数的yield一般与content_for一起使用:
partial
把partial作为view的一部分来渲染,可以调用render方法:
上面的代码会把文件名为_menu.html.erb的模板渲染到当前模板中。
渲染app/views/shared/_menu.html.erb到当前模板。
可以为partial单独指定layout:
partial的layout文件名必须以下划线开头:_graybar.html.erb,而且必须把layout模板文件和partial放在同一个目录下。
给partial传递局部变量
:locals选项用于设置partial的局部变量:
这样就可以在_form.html.erb中访问button_label和zone这两个变量。
每个partial都有一个和partial名字相同(不带下划线)的局部变量,可以通过:object选项给这个变量传递值:
这样就可以在_customer.html.erb中访问customer这个变量,它指向@new_customer。
当然,作为父模板(parent)的一部分,partial可以直接访问父模板的实例变量,例如这里的@new_customer,但是如果这么做的话,partial就跟父模板耦合了,变得不容易重用了。所以建议使用partial的名字来引用实例变量而不是直接访问实例变量。
之前版本的Rails中,如果不指定:object或者:locals选项,rails会自动在父模板中寻找与partial同名的那个实例变量作为partial的局部变量,如:
如果在_customer.html.erb中访问customer这个变量,rails将会自动在父模板中寻找名为@customer的实例变量。这个特性在Rails2.2中已经不建议使用了(deprecated)。Rails3.0中已经将这个特性移除了。
如果要传递给partial的实例变量名==partial名==model名,可以简写,如:
渲染集合(Collections)
:collection选项用于指定被传递给partial的集合对象,假设有books这么个集合,包含了5个Book对象,可以这样使用:
这样,在main.html.erb中,_book.html.erb的内容会被渲染5次。这时候,partial模板中,与partial同名的那个变量指向了:collection选项传过来的集合中的每一项。如果你不想使用这个与partial同名的变量名,可以通过:as选项来设置你想要的变量名(:as的值只能用symbol,不能是string,否则在partial里会得到nil值):
在设置:collection选项的时候,rails同时提供了一个counter变量给partial模板,变量名以partial名(不带下划线)开头,以_counter结尾,并且经试验,这个变量名不受:as选项影响(也就是说在上面的代码中,这个变量名应该是product_counter而不是item_counter)。其值为collection对象的索引值(从0开始)。
:spacer_template选项用于指定填充于collection每个member之间的模板:
上面的代码中,_product_ruler.html.erb的内容将被填充到每一对_product partial之间。
和:object一样,:collection也有简写形式:
好像如果_bar.html.erb不存在,但_bar.erb存在的话,rails是会找到_bar.erb的。
如果两者都不存在,rails的提示好像也是_bar.erb不存在之类的信息。
layout
layout最基本的使用很简单,默认的layout是app/views/layout目录里与controller同名的模板。如果要指定为其它布局,可以在controller里调用layout方法,像这样:
class ProductsController < ApplicationController layout "inventory" #.... end
之后,所有的action都将以app/views/layout/inventory.html.erb为布局来渲染模板。layout方法还支持:except和:only两个选项,用来选择layout方法影响到的action,顾名思义吧,不记了。
layout "product", :except => [:index, :rss]
动态布局
当layout方法的参数为一个symbol的时候,这个controller的布局是动态的,必须在controller里定义一个与symbol对应的方法(一般为private即可),这个方法必须返回一个字符串,用作指定布局的名字:
class ProductsController < ApplicationController layout :products_layout def show @product = Product.find(params[:id]) end private def products_layout @current_user.special? ? "special" : "products" end end
也可以这样写:
class ProductsController < ApplicationController layout proc { |controller| controller.request.xhr? ? 'popup' : 'application' } # ... end
结构化布局(Structuring Layouts)
Asset Tags
javascript_include_tag
在页面中引入js文件:public/javascripts/main.js:
<%= javascript_include_tag "main" %>
引入public/javascripts/main.js 和 public/javascripts/columns.js:
<%= javascript_include_tag "main", "columns" %>
引入public/javascripts/main.js 和 public/photos/columns.js:
<%= javascript_include_tag "main", "/photos/columns" %>
引入http://example.com/main.js:
<%= javascript_include_tag "http://example.com/main.js" %>
:defaults 选项可用于引入Prototype 和 Scriptaculous 库:
<%= javascript_include_tag :defaults %>
:all 选项加载public/javascripts目录下的每个js文件, 以Prototype 和 Scriptaculous开头:
<%= javascript_include_tag :all %>
:recursive 选项用于指定是否包含public/javascripts目录的子目录中的js文件:
<%= javascript_include_tag :all, :recursive => true %>
如果你加载了多个js文件,可以通过设置:catch选项为true来组合多个js文件到一个js文件中,从而增强用户体验。 :
<%= javascript_include_tag "main", "columns", :cache => true %>
默认的,这些js文件将被组合到javascripts/all.js中。你可以手动指定一个缓存文件的位置:
<%= javascript_include_tag "main", "columns", :cache => 'cache/main/display' %>
甚至可以使用动态的路径,像这样:cache/#{current_site}/main/display.
stylesheet_link_tag
stylesheet_link_tag的使用大致和javascript_include_tag相同,只是没有那个:defaults选项。另外,stylesheet_link_tag多了:media、:rel和:type三个选项,用于指定stylesheet link的media、rel和type值,默认值为:media="screen" rel="stylesheet" type="text/css"。
layout中的yield
在layout里面,yield用来标识view应该插入的地方。像这样:
<html> <head> </head> <body> <%= yield %> </body> </html>
带参数的yield一般与content_for一起使用:
<!--layout--> <html> <head> <%= yield :head %> </head> <body> <%= yield %> </body> </html> <!--view--> <% content_for :head do %> <title>A simple page</title> <% end %> <p>Hello, Rails!</p> <!--结果--> <html> <head> <title>A simple page</title> </head> <body> <p>Hello, Rails!</p> </body> </html>
partial
把partial作为view的一部分来渲染,可以调用render方法:
<%=render :partial=>"menu"%>
上面的代码会把文件名为_menu.html.erb的模板渲染到当前模板中。
<%= render :partial => "shared/menu" %>
渲染app/views/shared/_menu.html.erb到当前模板。
可以为partial单独指定layout:
<%= render :partial => "link_area", :layout => "graybar" %>
partial的layout文件名必须以下划线开头:_graybar.html.erb,而且必须把layout模板文件和partial放在同一个目录下。
给partial传递局部变量
:locals选项用于设置partial的局部变量:
<%= render :partial => "form", :locals => { :button_label => "Create zone", :zone => @zone } %>
这样就可以在_form.html.erb中访问button_label和zone这两个变量。
每个partial都有一个和partial名字相同(不带下划线)的局部变量,可以通过:object选项给这个变量传递值:
<%= render :partial => "customer", :object => @new_customer %>
这样就可以在_customer.html.erb中访问customer这个变量,它指向@new_customer。
当然,作为父模板(parent)的一部分,partial可以直接访问父模板的实例变量,例如这里的@new_customer,但是如果这么做的话,partial就跟父模板耦合了,变得不容易重用了。所以建议使用partial的名字来引用实例变量而不是直接访问实例变量。
之前版本的Rails中,如果不指定:object或者:locals选项,rails会自动在父模板中寻找与partial同名的那个实例变量作为partial的局部变量,如:
<%= render :partial => "customer" %>
如果在_customer.html.erb中访问customer这个变量,rails将会自动在父模板中寻找名为@customer的实例变量。这个特性在Rails2.2中已经不建议使用了(deprecated)。Rails3.0中已经将这个特性移除了。
如果要传递给partial的实例变量名==partial名==model名,可以简写,如:
#当@customer为Customer这个model的实例,并且partial名为customer时 <%= render :partial => @customer %> #相当于 <%= render :partial => "customer", :object=>@customer %>
渲染集合(Collections)
:collection选项用于指定被传递给partial的集合对象,假设有books这么个集合,包含了5个Book对象,可以这样使用:
#main.html.erb <%= render :partial => "book", :collection => books %> #_book.html.erb <p><%= book.name%></p>
这样,在main.html.erb中,_book.html.erb的内容会被渲染5次。这时候,partial模板中,与partial同名的那个变量指向了:collection选项传过来的集合中的每一项。如果你不想使用这个与partial同名的变量名,可以通过:as选项来设置你想要的变量名(:as的值只能用symbol,不能是string,否则在partial里会得到nil值):
<%= render :partial => "product", :collection => @products, :as => :item %>
在设置:collection选项的时候,rails同时提供了一个counter变量给partial模板,变量名以partial名(不带下划线)开头,以_counter结尾,并且经试验,这个变量名不受:as选项影响(也就是说在上面的代码中,这个变量名应该是product_counter而不是item_counter)。其值为collection对象的索引值(从0开始)。
:spacer_template选项用于指定填充于collection每个member之间的模板:
<%= render :partial => "product", :collection => @products, :spacer_template => "product_ruler" %>
上面的代码中,_product_ruler.html.erb的内容将被填充到每一对_product partial之间。
和:object一样,:collection也有简写形式:
<%= render :partial => @products %>
评论
2 楼
yuan
2010-08-19
星情泪 写道
非常好的整理。
顺便问一下楼主,有没有遇到过这样的情况,当
的时候,rails没有找post/_bar.html.erb却直接找post/_bar.erb了?
顺便问一下楼主,有没有遇到过这样的情况,当
<%= render :partal => 'post/bar' %>
的时候,rails没有找post/_bar.html.erb却直接找post/_bar.erb了?
好像如果_bar.html.erb不存在,但_bar.erb存在的话,rails是会找到_bar.erb的。
如果两者都不存在,rails的提示好像也是_bar.erb不存在之类的信息。
1 楼
星情泪
2010-08-19
非常好的整理。
顺便问一下楼主,有没有遇到过这样的情况,当
的时候,rails没有找post/_bar.html.erb却直接找post/_bar.erb了?
顺便问一下楼主,有没有遇到过这样的情况,当
<%= render :partal => 'post/bar' %>
的时候,rails没有找post/_bar.html.erb却直接找post/_bar.erb了?
发表评论
-
rails测试中遇到的一些问题
2010-09-03 11:41 25201,页面的测试。 假设某view中有一个表单,表单里有3个字段 ... -
BDD on Rails
2010-05-11 02:59 0首先,嘿嘿,我对敏捷 ... -
强大的 Rails 2 查询、搜索插件:SearchLogic
2010-04-20 23:31 5443发现还有人在看这个博客,这个 SearchLogic 只支持 ... -
authlogic-openid
2010-04-20 00:32 0http://github.com/binarylogic/a ... -
测试驱动开发实战(authlogic学习笔记)
2010-04-17 00:06 0这会是个很cool的笔记 cucumber还不会用,只用R ... -
RoR简单培训。
2010-04-12 10:08 0目的 上周二Bob给大家从总体上概括了一下Rails的开发。我 ... -
用RSpec和Webrat为页面写测试
2010-03-10 23:26 0The RSpec Book 23章(不完全照书上记,而是我自 ... -
rails杂记
2010-03-08 11:36 1438=======Rails2======= 用RSpec测试A ... -
Rails文件上传利器——paperclip笔记
2010-02-27 12:04 14934Githubhttp://wiki.github.com/th ... -
为SearchLogic添加一个remote_form_for方法。
2010-02-10 15:00 1391稍微看了一下,好像挺简单,只是处理了一下参数。 # A ... -
A Guide to Testing Rails Applications
2010-02-03 19:56 0什么是Fixtures fixtures允许你在测试运行之前往 ... -
改个bug
2010-01-20 17:38 1218问题见:http://yuan.iteye.c ... -
reset/reload
2010-01-20 16:26 1132http://caboo.se/doc/classes/Act ... -
Acts As Taggable On Steroids
2010-01-20 13:53 2608参考着mephisto写blog程序 ... -
Active Record Validations and Callbacks
2009-10-18 02:45 2373参考链接:http://guides.ru ... -
Rendering in Rails
2009-10-10 02:10 4520参考链接:http://guides.rubyonrails. ... -
如何为Rails的views写测试。
2009-10-01 16:53 1114原文链接:http://weblog.jamisbuck.or ... -
Rails Form helpers
2009-09-28 03:31 5167参考链接:http://guides.ru ... -
rails2.3 routes笔记
2009-09-23 04:10 2837参考链接:http://guides.ru ... -
rails中分模块开发。
2009-09-18 14:48 2307我没事就喜欢拿blog练手,blog简单嘛。 嗯,其实这是 ...
相关推荐
rails_layout, 为各种前端框架生成 Rails 应用程序布局文件 RailsLayout gem使用这里 gem 可以设置你选择的前端框架的布局文件:Zurb基础 5.3Bootstrap 4.0Bootstrap 3.3它还将为 Bootstrap 或者基础设置设计视图。...
《Rails 3 in Action》是2011年由Ryan Bigg撰写的一本关于Ruby on Rails框架的权威指南,专门针对当时最新的Rails 3.1版本进行了深入解析。这本书旨在帮助开发者充分利用Rails 3.1的强大功能,提升Web应用开发的效率...
### Rails 4 in Action, 第二版:关键知识点解析 #### 一、Rails 4简介与新特性 **Rails 4 in Action, 第二版** 是一本深入介绍Ruby on Rails框架的专业书籍。该书由Ryan Bigg、Yehuda Katz、Steve Klabnik和...
### Ruby on Rails 2.1 新特性详解 #### 引言 自2004年7月David Heinemeier Hansson公开发布Ruby on Rails框架以来,这一轻量级且功能强大的Web开发框架迅速赢得了全球开发者们的青睐。经过三年多的发展与优化,在...
Rubyisms in Rails
WeChat in Rails 的 API、命令和消息处理
唔,1分应该还是有人下的吧,共同学习进步,Ruby on Rails is an open source web framework.... "Rails 4 in Action" is a fully-revised second edition of "Rails 3 in Action." This hands-on, compreh...
《Rails101_by_rails4.0》是一本专注于Rails 4.0.0版本和Ruby 2.0.0版本的自学教程书籍,它定位于中文读者,旨在成为学习Rails框架的参考教材。Rails(Ruby on Rails)是一个采用Ruby语言编写的开源Web应用框架,它...
We still start with a step-by-step walkthrough of building a real application, and in-depth chapters look at the built-in Rails features. This edition now gives new Ruby and Rails users more ...
Ruby on Rails,通常简称为Rails,是一个基于Ruby编程语言的开源Web应用框架,遵循MVC(Model-View-Controller)架构模式。这个“Rails项目源代码”是一个使用Rails构建的图片分享网站的完整源代码,它揭示了如何...
Rails 3.1 和 Cucumber-Rails 1.2.0 是两个在Web开发领域非常重要的工具,尤其对于Ruby on Rails框架的测试和自动化流程。本文将深入探讨这两个组件,以及它们如何协同工作来增强软件开发的效率和质量。 首先,...
从给定的文件信息来看,我们正在探讨的是一本关于Ruby on Rails的书籍,书名为《Simply Rails2》,作者是Patrick Lenz。本书旨在为初学者提供深入理解Ruby on Rails框架的指南,从基础概念到高级主题均有涵盖,是...
标题 "Rails" 指的是 Ruby on Rails,一个开源的Web应用程序框架,它基于Ruby编程语言,遵循MVC(模型-视图-控制器)架构模式。Rails由David Heinemeier Hansson在2004年创建,其设计理念是强调代码的简洁性、DRY...
Rails指南中文版是针对Ruby on Rails框架的一份详尽教程,旨在帮助开发者深入理解并熟练掌握这个强大的Web应用开发工具。Ruby on Rails(简称Rails)是一个基于Ruby语言的开源Web应用框架,它遵循MVC(Model-View-...
### Ruby on Rails Guides v2 - Ruby on Rails 4.2.5 #### 一、重要概念及基础假设 - **重要概念**:本指南旨在帮助读者深入理解Ruby on Rails(以下简称Rails)4.2.5版本的核心功能与最佳实践。 - **基础假设**:...
在开发Web应用时,Ruby on Rails(简称Rails)框架因其高效、简洁的代码风格和强大的社区支持而备受青睐。Aptana是一款强大的集成开发环境(IDE),尤其适用于Rails项目的开发,它提供了丰富的特性来提升开发效率。...