【render】partial及其局部变量

原文:http://www.cnblogs.com/lwm-1988/archive/2011/09/13/2175041.html

1. partial

1.1 把partial作为view的一部分来渲染,可以调用render方法:

<%=render :partial=>"menu"%>

#上面的代码会把文件名为_menu.html.erb的模板渲染到当前模板中。

<%= render :partial => "shared/menu" %>

#渲染app/views/shared/_menu.html.erb到当前模板。

1.2 可以为partial单独指定layout:

<%= render :partial => "link_area", :layout => "graybar" %>

#partial的layout文件名必须以下划线开头:_graybar.html.erb,而且必须把layout模板文件和partial放在同一个目录下。

2. 给partial传递局部变量

2.1 :locals选项用于设置partial的局部变量:

<%= render :partial => "form", :locals => { :button_label => "Create zone", :zone => @zone } %>

#这样就可以在_form.html.erb中访问button_label和zone这两个变量。

2.2 每个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中已经将这个特性移除了。

2.3 如果要传递给partial的实例变量名==partial名=model名,可以简写,如:

#当@customer为Customer这个model的实例,并且partial名为customer时

<%= render :partial => @customer %>

#相当于

<%= render :partial => "customer", :object=>@customer %>

3. 渲染集合(Collections)

3.1 :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 %>

3.2  下标索引值

在设置:collection选项的时候,rails同时提供了一个counter变量给partial模板,变量名以partial名(不带下划线)开头,以_counter结尾,并且经试验,这个变量名不受:as选项影响(也就是说在上面的代码中,这个变量名应该是product_counter而不是item_counter)。其值为collection对象的索引值(从0开始)。

3.3 :spacer_template

:spacer_template选项用于指定填充于collection每个member之间的模板:

<%= render :partial => "product", :collection => @products, :spacer_template => "product_ruler" %>

上面的代码中,_product_ruler.html.erb的内容将被填充到每一对_product partial之间。

和:object一样,:collection也有简写形式: <%= render :partial => @products %>

时间: 2024-10-26 08:18:28

【render】partial及其局部变量的相关文章

rails局部模板 render

<%= render partial: 'file' %> file是以_开头命名的文件,比如_cart.html.erb 这样就可以用render来调用了 还可以传参数 比如 rails 2.0 p87 传一个集合 render(:partial => "cart_item", :collection => @cart.items) 这样局部模板就得到了一个变量如cart_item 在_cart_item.html.erb中就可以用cart_item这个变量了

12月10日 render( locals:{...}) 传入本地变量。

Jdstor第一部分后台设计,4-4上传图片. 3.4 Using Partials--3.4.4 Passing Local Variables You can also pass local variables into partials, making them even more powerful and flexible. show.html.erb: <%= render partial:"image", locals:{product:@product} %>

11月24日 layouts and rendering in rails(部分没有看)

http://guides.rubyonrails.org/layouts_and_rendering.html 中文 This guide covers the basic layout features of Action Controller and Action View After reading the guide, i will know: 1.How to use the various rendering methods bulit into Rails. 2.How to c

d3js网络拓扑关系特效

d3js拓扑关系特效 <%= render partial: 'bar' %> <style> .table td{ text-align: center; } td .progress { margin-bottom: 0; width: 175px; } td .progress-text { position: absolute; width: 175px; text-align: center; } .tdwidth{width:175px;} .progress { ma

关于添加图片到svg中,rails下使用js, 用parseFloat来调整force.on时的位置

注意在代码中用/表示路径...windows中file才是\ 1.<image xlink:href=<%= asset_path 'vnet/virtual_switch.png' %> x="0" y="0" height="30px" width="30px"/> (1)在html中科院直接用嵌入式的方式获得rails中的图片.比如这里的图片放在\app\assets\images\vnet\vi

select_tag 选择后自动提交,并且保持选择的项

使用select来选择,,,选择就响应真是花了好大的功夫....你妹...在controller设置变量来储存选择后的值...js中如果select选择为空那么传入的值是””而不是null selectedIndex的值都是数字,从0开始,而不是option的值 controller #sdn的网络流量监控 def monitor @vms = VirtualMachine.owned_by(current_user).select('*').joins("left join vnets on

form_tag

class SwitchesController < ApplicationController #before_filter :authenticate_user!, :except => [:index, :show] def index end def show end #存储拓扑 def topo @vts = VmToSwitch.all @sts = SwitchToSwitch.all @stvs = SwitchToVswitch.all end #监控 def monitor

haml入门

1.什么是Haml Haml是HTML abstraction markup language,遵循的原则是标记应该是美的.Haml可以加速和简化模版,优点是简洁.可读.高效. 2.erbm模板和haml模板对比 .erb模板代码: <section class="container"> <h1><%= post.title %></h1> <h2><%= post.subtitle %></h2> &

RailsCase30 Pretty Page Title 动态变化的网页标题

几乎所有的Rails网站都使用layout,但这回造成所有的网页都有同样的标题(在header中的title).为每个网页设置独有的标题并不是件困难的事,解决方案见下文. 初步尝试 ruby <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="ht