频 道 直 达 - 新闻 - 培训 - 软件 - 教程 - 前沿 - 组网 - 系统应用 - 安全 - 编程 - 存储 - 操作系统 - 数据库 - 服务器 - 专题 - 产品 - 案例库 - 读书 - 博客 - BBS
51CTO.COM_中国最大的网络技术网站
找资料:

2.3.2 改进“浏览留言”

作者: 李刚 郭秋霞 出处:电子工业出版社  2008-04-02 15:06    砖    好    评论   进入论坛
阅读提示:《Ruby on Rails敏捷开发最佳实践》第2章向读者示范如何开发一个简单的Rails应用,这个Rails应用是一个简单的留言系统。本文讲了改进“浏览留言”。

2.3.2  改进“浏览留言”

我们希望当用户成功登录系统后,首先进入浏览留言页面,这需要修改user_controller.rb控制器文件中的login方法,将合法用户登录成功后重定向到message控制器中的list Action。代码片段如下:

redirect_to :controller=>"message", :action=>"list"   
message控制器的list Action负责列出系统中所有留言,scaffold默认生成的list Action已经具有分页功能,因此我们不需要改变list Action。list Action的代码如下:

def list
# 执行分页查询
@message_pages, @messages = paginate :messages, :per_page => 10
end

上面的list Action里使用了Rails提供的分页查询支持,通过这种分页查询支持,可以非常方便地以分页方式列出所有留言。

与该list Action对应的视图文件是/app/views/message路径下的list.rhtml文件。其中,用于列出所有留言内容的代码片段如下:

<table width=100% border=0 align="center" cellpadding="0" cellspacing="0" bgcolor="#BFCAE6">
<tr>
<td colspan="6" id="title">所有留言</td>
</tr>
<tr>
<td width="30%"><b>标题</b></td>
<td width="30%"><b>时间</b></td>
<td width="10%"><b>是否有图</b></td>
<td width="15%"><b>留言人</b></td>
<td colspan="2">&nbsp;</td>
</tr>
<!-- 遍历@messages实例变量中的每一个message对象 -->
<% for message in @messages %>
<!-- 调用cycle帮助方法来设置循环的行的CSS样式 -->
<tr class="<%= cycle("even", "odd") %>" >
<!-- 调用truncate帮助方法,将title值设置为只显示前25个字符 -->
<td width="30%" ><%= truncate(message.title, 25) %></td>
<!-- 调用自定义的show_date帮助方法,来返回指定格式的日期形式 -->
<td width="30%" ><%= show_date(message.created_at) %></td>
<td width="10%">
<!-- Message对象调用自定义的has_picture?方法,查询留言是否有贴图 -->
<% if message.has_picture? then %>
<font style="color:red">有图</font>
<% end %>
</td> 
 <!-- Message对象调用user实例方法,返回该对象对应的User对象 -->
<td width="15%"><%= message.user.name %></td>
<td width="7%"><%= link_to '查看', :action => 'show', :id => message %></td>   
<td>
<% if session[:user_id] == message.user.id then %>
<%= link_to '删除', { :action => 'destroy', :id => message }, :confirm => '您确定删除吗?',
:post => true %>
<% else %>
&nbsp;
<% end %>
</td>
</tr>
<% end %>
</table>


修改后的list页面比原来的代码丰富了很多,主要是增加了设置奇数行和偶数行的CSS样式,只显示标题的前25个字符,格式化日期的显示方式,以及为有贴图的留言显示“有图”字样。

值得注意的是,在上面的代码中,Message对象调用user实例方法,来返回该对象对应的User对象。读者可能觉得奇怪,哪里定义的user实例方法呢?因为Message Model和User Model是两个关联实体,且Message Model是User Model对应的从表实体,所以,在message.rb模型文件中加入如下代码:

# 调用Rails中的belongs_to方法,声明Message对象是User对象的从表对象
belongs_to :user

即可由belongs_to提供一系列方便地操作关联对象的实例方法,其中就有user实例方法。这样,当Message对象调用user实例方法时,就能十分方便地查找到它所对应的User对象,而不需要通过如下代码来返回User对象。 

user_id=message.user_id
user=User.find(user_id)

这种方式是先查询出留言对象的user_id,再通过这个user_id查找到对应的User对象。相比之下,我们在Rails中仅仅调用一个belongs_to方法,即可实现同样的功能,代码要简洁得多。
由于list.rhtml文件中调用了自定义的has_picture?方法,来查询留言是否有贴图,所以需要在message.rb模型文件中定义该方法。代码如下:

# 设置允许上传的图片文件最大为50 kb
MAX_IMAGE_SIZE = 50*1024
# 该方法用于检查Message对象是否有图片
def has_picture?
transaction do
# 如果Message对象的图片内容的类型不为nil
if self.picture_content_type!=nil then
# 如果存在合法的上传图片
# 即:文件类型为图片,且文件大小不超过允许上传的最大图片的大小
if (self.picture_content_type).split("/")[0]=="image" &&
self.picture_data.size<= MAX_IMAGE_SIZE
then
return true
end
end
return false
end
end

该方法的定义中,先判断Message对象的picture_content_type属性值是否为nil;如果不为nil,再判断是否存在合法的上传图片。也就是,仅当Message对象的picture_content_type属性值为图片类型的值,且文件大小不超过允许上传的最大图片的大小时,has_picture?方法才返回true,其他情况均返回false。
另外,由于list.rhtml文件中调用了自定义的show_date帮助方法,来返回格式化的日期形式,因而,需要在/app/helpers路径下的message_helper.rb文件中定义该方法。代码片段如下:

def show_date(date)
# 日期将会被格式化成:年月日 时分秒
date.year.to_s+"年"+date.month.to_s+"月"+date.day.to_s+"日"+"  "+date.to_s.split(" ")[3]
end

该方法用于格式化需要显示的日期,使之符合我们的计时习惯。
控制器中不需要修改scaffold生成的代码。当用户使用这个应用成功登录后,就会进入浏览留言的页面。

【责任编辑:雪花 TEL:(010)68476606】

回书目   上一节   下一节
专题
Ruby on Rails敏捷开发最佳实践
NAC安全访问控制
精通Ajax——基础概念、核心技术与典型案例
2008年春季英特尔信息技术峰会(IDF)
C专家编程
我也说两句

匿名发表

(如果看不清请点击图片进行更换)


中 国 最 大 的 网 络 技 术 网 站 ·
技 术 成 就 梦 想
订阅技术快讯
电子杂志下载
名称:SQL Server数据库管理精品黄皮书
简介:书中文章经过精挑细选,便于用户能根据自己的实际工作和学习,快速在本书寻找到相关资料。内容涵盖了SQL Server的安装与升级、语句查询、数据备份和恢复、自动化任务、数据同步、数据字典、安全和预防、性能和优化、集群等各方面应用信息,以及DBA管理人员在数据库管理工作中
名称:2007路由技术大全
简介:《2007路由技术大全》由51CTO.com网站特别策划制作,该书包括路由器技术、路由器产品、路由器配置、安全设置、路由器故障处理、路由器密码恢复,以及广大网友在实践使用中的心得经验和技巧文章,内容注重实用性,适用于初学者入门,也适合多年从业者提高,是一本实践和理论完
名称:网络安全精品应用黄皮书
简介:《2007精品网络安全黄皮书》包括了9个大类24个小类, 800余篇文章,内容包含了熊猫烧香病毒、DDOS攻击、ARP病等热点问题的介绍及解决方案。从病毒查杀、防范、系统、数据等各方面的安全设置到黑客技术的了解、防范,涉及到了安全应用的全部领域, 由浅至深内容全面。
NAC安全访问控制
NAC安全访问控制
华为员工自杀频频拷问企业文化
华为员工自杀频频拷问企业文化
2008年春季英特尔信息技术峰会(IDF)
2008年春季英特尔信息技术峰..
· 2008年春季英特尔信息..
· 技术人求职简历完备手册
· 国际文档格式标准开战
· WCF开发基础
· Visual Studio 2005开..
· Linux——从菜鸟到高手
· 如何优化IT 控制能耗
· SQL Server入门到精通
· SQL Server 2008/2005..
· 贝恩资本携手华为22亿..
· ARP攻击防范与解决方案
· 初探敏捷开发
· 体验Visual Studio 200..
· SOA 面向服务架构
· CISSP认证成长之路
· 隐私保护技术探讨
清除流氓软件——51CTO特别专题
清除流氓软件——51CTO特别专..
ARP攻击防范与解决方案
ARP攻击防范与解决方案
iSCSI应用与发展
iSCSI应用与发展
· iSCSI应用与发展
· SQL Server 2008/2005..
· SOA 面向服务架构
· SQL Server 2008/2005..
· iSCSI应用与发展
· RAID——磁盘阵列基础
· 中间件应用技术专题
· SQL Server入门到精通
· 病毒查杀专题
· 国际文档格式标准开战
· Linux防火墙
· 打造安全服务器
· Sniffer安全技术从入门..
· SOA 面向服务架构
· ADSL应用面面俱到
· 入侵防护系统(IPS)初探
ARP攻击防范与解决方案
ARP攻击防范与解决方案
SQL Server 2008/2005全解
SQL Server 2008/2005全解
iSCSI应用与发展
iSCSI应用与发展
· iSCSI应用与发展
· 中间件应用技术专题
· SQL Server入门到精通
· SQL Server 2008/2005..
· SOA 面向服务架构
· iSCSI应用与发展
· RAID——磁盘阵列基础
· 身份认证技术
· 病毒查杀专题
· 清除流氓软件——51CTO..
· Sniffer安全技术从入门..
· SOA 面向服务架构
· 了解统一威胁管理(UTM)..
· ADSL应用面面俱到
· ADSL应用面面俱到
· 反垃圾邮件技术应用