Rails -- 局部模板

Rails相关知识 => 局部模板

模板基础:

 

  View 层模板可以由三种方式写成。有 .rhtml 扩展名的模板文件混合使用ERb和HTML。有 .rxml扩展名的模板文件使用Builder::XmlMarkup库。有 .rjs扩展名的模板使用了ActionView::Helps::PrototypeHelper::JavaScriptGenerator。

一、RHTML

 

  Rails使用了一个名为Erb的模板解析引擎作为View的底层技术。可以用 .rhtml 文件来创建模板,它将使用标准的Web模板符号来生成基于静态HTML的服务端代码。

  在RHTML页面中使用Ruby程序块的常用方法是使用<%= %>和<% %>构造块组织一小块数据。两者的区别是Ruby程序块的结果是否做为一个内嵌的文本显示给用户。

 

二、使用局部模板

  局部模板用来消除重复。你可以把一个局部模板当成一种子程序:你可从其它模板中调用一次或多次局部模板,只要把它做为参数传递给render对象。当局部模板完成提交时,它返回控制给调用它的模板。
局部模板与其它模板外观上的的区别是它的文件以下划线”_”字母开头。

 

三、RJS模板

  JavaScriptGenerator 模板文件以 .rjs为扩展名。与用于提交一个动作结果的传统RHTML模板不同,它生成如何修改一个已经被提交页的指令。这样就可轻易地修改一个声明了Ajax应答 的页面内多个元素。这些模板的动作由后台的Ajax调用,并更新请求的原始页。

 

四、模板环境

  模板是包含文本和代码的混合体。代码用于添加动态的内容给模板。代码运行环境能让它访问由控制器设置的信息。
1、控制器的所有实例变量在模板内也是有效的。这就是为什么动作能传递数据给模板的原因。
2、控制器对象的headers,params,request,response和session做为存取器方法在view内也是有效的。但通常view代码或许不应该使用这些,对它们处理职责应该留给控制器。
3、当前所用控制器对象可用属性controller来访问。
4、模板的基本目录路径在属性base_path内是效的。

 

局部模板:

  一、使用实例变量
模板可以共享它们之间正常植入标记定义的实例变量。
例如: <% @page_title = "A Wonderful Hello" %>
<%= render "shared/header" %>
现在,页眉可以拾取@page_title变量,并使用它来输出一个 title 标记:
<title><%= @page_title %></title>

 

二、传递给局部模板内局部变量的值

  你可以传递局部变量给局部模板。通过将局部变量名做为键,对象做为值的哈希表来做到。例如:
<%= render "shared/header", { "headline" => "Welcome", "person" => person } %>
现在可以在 shared/header 内访问它们:
Headline: <%= headline %>
First name: <%= person.first_name %>
也可以加上:locals来指出向局部模板传递局部变量。例如:
<%= render :partial => "account", :locals => { :account => @buyer } %>
<% for ad in @advertisements %>
<%= render :partial => "ad", :locals => { :ad => ad } %>
<% end %>

例 子首先提交 "advertiser/_account.rhtml"局部模板,并且传递实例变量@buyer给用于显示的局部模板做为它的局部变量account 。然后提交"advertiser/_ad.rhtml" 并传递局部变量 ab 给用于显示的局部模板做为它的局部变量。
三、局部模板内的特殊局部变量
在局部模板内有个特殊的局部变量,它与局部模板的名字是一样的。而render对象内的:object参数就用于将标识被传递给局部模板的对象。
例如:提交一个博客条目的局部模板,通常被存储在视图目录app/views/blog中的_article.rhtml文件内。
<div class=”article”>
<div class=”articleheader”>
<h3><%= article.title %></h3>
</div>
<div class=”articlebody”>
<%= h(article.body)%>
</div>
</div>

 

  其它模板使用render(:partial=>)方法来调用它。

<%= render(:partial => “article”, :object => @an_article) %>
<h3>Add Comment</h3>
通过:object这个“桥”,局部模板内的局部变量article获得了其它模板内的实例变量@an_article的值。
事实上,如果被传递给局部模板的对象是控制器内带有与局部模板同名的实例变量的话,就可以忽略:object参数。在上面例子中,如果控制器已在与将要调用的局部模板同名的实例变量@article内设置了article的值,那么视图就可以这样来提交局部模板:
<%= render(:partial => “article”) %>
<h3>Add Comment</h3>

 

四、提交一个局部模板的集合

  前面我们曾写过这样的代码:
<% for ad in @advertisements %>
<%= render :partial => "ad", :locals => { :ad => ad } %>
<% end %>
此例子中需要对一个数组@advertisements进行迭代,并为数组内的每个元素提交一次局部模板。现在这个模式已被一个单独的方法实现了。

 

  现在,可以把三行代码重写为一行代码:

<%= render :partial => “ad”, :collection => @advertisements %>
这将提交_ad.rhtml局部模板,并且依次传递实例变量数组内每个值给局部模板内的局部变量ad。同时格式为partial_name_counter的迭代器counter将对模板自动有效。在上面例子中该变量为ad_counter。
总结就是传递给render()的:collection参数可以与:partial参数结合起来。:partial参数使用一个局部模板来定义每个条目的格式,:collection参数给集合内的每个成员应用这个模板。
还有个可选的:spacer_template参数让你指定集合内两个元素之间被提交的模板。例如:
<%= render(:partial => “animal”,
:collection => %w{ant bee cat dog elk},
:spacer_template => “spacer”) %>
它使用_animal.rhtml来提交数组内给出的每个animal,在元素之间都提交_spacer.rhtml。如果_animal.rhtml包含:
<p>The animal is <%= animal %></p>
若_spacer.rhtml包含:
<hr />
则会看到一个animal名字的列表,并且各个名字之间有个水平线。

 

  五、共享局部模板

Rails约定存储共享局部模板在app/view/shared目录内。如:
<%= render(:partial => “shared/post”, :object => @article) %>
@article对象将被赋值给局部模板内的局部变量post。
六、局部模板,控制器和RJS
不只是视图模板可以使用局部模板。控制器也可以在一个动作上使用它。局部模板也可以让控制器从视图本身使用的同一局部模板的页中生成片断。当你从使用局部模板的控制器中,用Ajax来更新部分页时这是很有用的。
Rails使用RJS模板来创建一个JavaScript程序块,并根据页面内容求值,执行,最终在当前页中显示出来。通过RJS模板可实现与当前页面中DOM元素的交互。

转载于:https://www.cnblogs.com/tenapple/archive/2009/05/02/1447952.html

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值