rails 局部模板 partial render 介绍

需要用这样的形式来使用:render :partial => ‘path/filename’。应当注意的是,相应的模板(.rhtml)文件该保存为“_”开头的。比如我的模板文件在app/views/book /_search_form.rhtml,若在BookController的方法中调用时,直接用

render :partial => ’search_form’

若在别的控制器中,则需要

render :partial => ‘book/search_form’

rails中的redirect 和 render区别

Rails里

1. render 和 redirect 只能用一个

2. render 可以翻译成提交,一般的电脑语言翻译成渲染,Rails里render可以自动方式和手动两种

3. 动作控制器通过render方法发送内容给用户,大多数都是提交一个“模板”。视图可以看懂erb的模板,显示出@变量(实例变量)----这种render提交和渲染(把模板呈现为用户看到的视图)过程是自动的,不用你命令render去执行

简单说就是controller中方法里定义的@foo变量,view中rhtml可以用<%=@foo%>显示出来

4. 动作”的结果是提交不同的“模板”时,手工使用render方法

看看书上的介绍

def search
@results =Search.find(params[:query])
case @results
when 0 then render :action=> "no_results"
when 1 then render :action=> "show"
when 2..10 then render :action=> "show_many"
end
end

5. Render的方法可以提交不同的内容


* render(:text=>string) 直接render出文本
* render(:inline=>string,[:type=>"rhtml"|"rxml"])
把传入的string当成模板处理, 相当于rhtml的内容
* render(:action=>action_name) 直接调用某个action的模板,
相当于forward到一个view
* render(:file=>path;[:use_full_path=>true|false]) 使用某个模板文件
render, 当use_full_path打开时可以传入相对路径
* render(:template=>name) 使用模板名render ,
例子如下 render(:template => "blog/short_list")
# 自动使用/app/views/blog/short_list.rhtml(rxml)
* render(partial=>name) :partial
* render(:nothing=>true) 什么也不输出,包括layout
* render() 默认的的render, 相当于render(:action=>self)

而redirect 是引导重新定向

* redirect_to(:action=>'xxx') 使用语法和url_for一样(底层用url_for)
* redirect_to("/localpath")
* redirect_to("http://url")

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值