rubycon:Ruby on Rails:动作视图纵览

  本文将讨论RoR中提供基础服务的:动作视图动作视图可以使你更快速地将数据展现给用户在本文中将介绍些动作视图服务并且将举个例子来介绍说明如何使用动作视图

  在MVC模式中V即视图(View)作用是将数据以用户所需要形式展现出来和传统模式区别视图在展现数据时可以省去许多不必要细节也就是说任何基于MVC模式框架(framework)都应该提供更容易思路方法提取和显示需要数据RoR就是这样框架它将动作视图作为其核心组件的

  在本文中将主要讨论动作视图基础服务部分介绍了和动作视图相关服务在第 2和第 3部分讨论动作视图些基本功能在最后部分将给出个例子来介绍说明如何使用动作视图

  动作视图服务

  视图功能就是向用户展现数据下面列举了动作视图中主要服务:

  ·模板

  ·布局

  ·分页

  当然在动作视图中还在很多服务但上面 3个服务在动作视图中是最重要

  模板

  所谓模板就是在个文件中预定义了些共用资源应用通过使用这些共用资源可以简化应用开发过程从而达到重用在动作视图中模板所包含资源主要就是布局信息、些数据所存放路径等在动作视图中模板很多如HTML格式登录模板、以及Email模版等

  布局

  从软件Software(包括Web和桌面)上来说布局就是将GUI中Control控件进行组织和安排也就是说布局控制着GUIControl控件(如按钮、文本框等)如何被放置在界面上例如布局可通过垂直等间距方式将要排列Control控件按垂直方向等间距进行排列

  分页

  分页作用就是将大量数据分批地显示在页面上可通过"上页"和"下页"进行页间切换分页有些象用打印机打个大文档张纸打不下就将数据分成多张纸来打虽然将分页这种显示数据方式应用到中可以解决大数据量显示问题但这同时又会带来另外个问题那就是如果对数据进行导航也就是翻页问题

  除了以上提到服务外在动作视图中还有其它服务如格式化助手等但是上面所介绍 3个服务是动作视图中最重要在下部分我们将讨论如何使用这些服务

  模板和格式化助手

  动作视图为我们提供了很多建立动态视图服务下面是动作视图提供主要服务:

  ·模版

  ·格式化助手

  ·分页

  ·布局

  上面4种服务除了格式化助手外其它 3个服务都已经在前面介绍过了

  模板

  就象以前讨论在模板中包含了些代码、标记、简单文本或它们组合在其中代码可以通过Controller中访问信息提供动态内容代码通过执行环境访问信息这个环境为代码提供了以下信息:

  1. Controller例子变量通过这些变量可以将数据从Controller传给模板

  2. 作为存取器Controller对象这些对象包括对象头、参数、请求、响应和会话

  3. 当前正在使用Controller对象模板代码可以从这个Controller对象中public思路方法

  在RoR中模板是RHTML文件RHTML文件有些类似于JSP文件在RHTML文件中有静态HTML也有动态内容动态内容可以由内嵌代码生成技术产生也可以用手工编写如以下RHTML文件显示了当前日期和时间:

<h1>大家好!</h1>
<p>
<b>
当前日间: <%= Time.now %>
</b>
</p>


  和JSP类似在RHTML中有两种写动态代码思路方法种是将代码写到<%= … %>中另外种是将代码写在<% … %>中在<%= … %>中Ruby语句只是当作个值返回如果其中含有多条语句则返回最后条语句而将代码放到<% … %>中则按着正常逻辑执行虽然RHTML中可以执行Ruby语句但最好不要将商业逻辑代码写在RHTML中代码执行原理可看下面例子

  如果有以下代码:

<% 5.times do %>
<5>
<% end %>


  在执行RHTML时将上述代码转换为Ruby语句:

5.times do
puts "<5>"
end
  格式化助手

  视图个重要功能就是可以将从Controller传过来数据进行格式化以便用户更容易理解这些数据RoR提供格式化助手就是用来完成这个功能格式化助手主要可以格式化 3类信息:数字、日期和文本下面将讨论如何使用格式化助手对这些信息进行格式化

  数字和日期格式化

  格式化助手可以进行多种转换工作如将本地时间转换成另外种形式将数字转换成货币类型、百分比或电话号下面是些转换例子: <%= distance_of_time_in_words(Time.now, Time.local(2006, 11, 1)) %>

  将得到4或其它数字(根据你运行它日期区别而区别)

<%= distance_of_time_in_words(Time.now, Time.now + 40, false) %>

  将得到1分钟(40表示秒)

<%= number_to_currency(99.99) %>

  将得到$99.99

<%= number_to_percentage(66.6666) %>

  将得到 66.667%

<%= number_to_percentage(66.66666, :precision => 1) %>

  将得到 66.7%

<%= number_to_phone(1125551212) %>

  将这个数字转换为 112-555-1212

  格式化文本

  同样格式化助手也可以格式化文本格式化操作包括截取加亮显示串中甚至可以将个单词转换成复数下面是例子:

  替换子串

<%= excerpt(@str, "you", 8) %>

  如果@str中串是 "I love …"那么就应该返回"I love you"

<%= highlight(@str, "love") %>

  如果@str中串是"I love you."

  那应该显示:

I <strong ="highlight">love</strong> you.

  在串转换中最有意思转换可能就是将英文单词单数形式转换成复数形式(你可以用这个功能查下单词复数形式是什么)

<%= pluralize(2, "person") %>

  显示 2 people.

  分页

  在第部分我介绍了分页概念在这部分我将讨论如何通过RoR使分页变得更容易RoR通过控制层和视图层实现分页在控制层RoR分页系统控制从数据库中得到记录在视图层显示从控制层得到数据以及用于分页显示导航条下面例子描述了将users表分页显示过程:

  控制层实现:

  在控制层分页必须按如下代码实现:

def user_list
@user_pages, @users = paginate(:users, :order_by => 'name')
end


  以上代码通过paginate思路方法设置分页器这个思路方法有两个参数个参数是要读取数据名子第 2个参数是在取数据时要排序字段这个思路方法返回两个对象个对象@user_pages是分页器对象 第 2个对象 @users 是每记录数其中@users用来向视图提供要显示数据 而@user_pages负责从表中得到数据然后将这些数据保存在@users中

  视图层实现:

  在视图层RHTML文件中@users中数据将被展现给用户pagination_links思路方法可以实现导航功能以下是具体实现代码:

<table>
<tr><th>姓名</th></tr>
<% for user in @users %>
<tr><td><%= user.name %></td>
<% end %>
</table>
<hr>
<%= pagination_links(@user_pages) %>
<hr>


  看看上面代码是不是很简单!!

  布局

  在模板中可以通过布局提供子模板这就意味着RoR可以通过布局进行嵌套操作布局提供了个典型网页各种组成部分如菜单、页脚等下面是个简单有关布局例子

<html>
<head>
<title>Form: <%= controller.action_name %></title>
<%= stylesheet_link_tag 'scaffold' %>
</head>
<body>
<%= @content_for_layout %>
</body>
</html>


  上面代码是个标准HTML布局最值得关注是变量@content_for_layout这个变量中保存了从控制层传过来数据下面代码演示了如何从控制层传递数据到个RHTML文件:

def method
@msg ="测试!"
end


  下面是method.rhtml 文件中代码:

<h1><%= @msg %></h1>

  变量@content_for_layout 内容如下:

<h1>测试!</h1>

  由布局生成HTML代码如下:

<html>
<head>
<title>Form: method</title>
<link href="/stylesheets/scaffold.css" media="screen" rel="Stylesheet" type="text/css"/>
</head>
<body>
<h1>测试!</h1>
</body>
</html>




  上面例子只是简单地演示了如何使用布局在RoR提供自动生成代码机制中scaffold就是使用布局来生成输出文件在下部分将给个简单例子来演示如何使用模板和格式化技术

  例子

  在这个例子中显示了些被格式化时间、串和数字

  下面代码是控制层代码:

SayController < ApplicationController
def hello
@time=Time.now
end
end


  下面是视图层(这个文件就是个模板)代码:

<html>
<head>
<title>你好!</title>
</head>
<body>
<h1>现在报时:<%=@time%></h1>
</body>
</html>


  现在让我们使用格式化功能:

SayController < ApplicationController
def hello
@time=Time.now
@rule="This is a rule"
@price=123
end
end


  下面在视图中使用格式化助手进行格式化:

<html>
<head>
<title>你好!</title>
</head>
<body>

现在报时:<%=@time%>

时间间隔:<%= distance_of_time_in_words(@time, Time.local(2006, 10, 11)) %>

高亮度显示rule:<%= highlight(@rule, "rule") %>

将123转换成美元:
<%= number_to_currency(@price) %>
</body>
</html>




Tags:  rubyonrail rubyonrails rubycon rubycon

延伸阅读

最新评论

发表评论