Ruby on Rails敏捷开发最佳实践
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

第1篇 Ruby on Rails入门

第1章 Ruby on Rails和企业级应用开发

企业级应用正进入一个前所未有的繁荣阶段,随着全球化进程的速度越来越快,所有的公司也越来越重视企业信息化进程,企业级应用作为支撑企业信息化的重要工具,面临着巨大的需求和缺口,所以企业级应用的开发平台也越来越丰富。

经典的Java EE企业级开发平台支撑了市面上大部分企业级应用,而.NET开发平台也慢慢在企业级应用开发平台上活跃起来。除此之外,还有PHP,Python等开发工具,也都在各自的领域快速发展。

Ruby on Rails开发平台像一匹“黑马”,在企业级应用开发平台上迅速崛起。它借助Ruby语言的动态特征、简洁性等优点,并依赖于Rails框架的高效性,迅速引起企业应用开发界关注。Ruby on Rails开发平台的开发效率号称是Java EE平台的10倍,虽然这个说法缺乏准确性,但也反映了它带来的效率革命。

Ruby on Rails应用模拟了轻量级Java EE应用的应用架构,但简化了Java EE应用的配置文件,它以“约定优于配置”的策略,省略了绝大部分配置文件,开发者只要按Ruby on Rails平台的约定进行定义,就可以快速开发出各种应用。

虽然国内现阶段还未见到大规模使用Ruby on Rails开发的现象,但在国外Ruby on Rails已经开始逐渐流行起来,相信在不久的将来,它将会逐渐占领更多的企业级应用开发市场。而且,Ruby on Rails的简洁性,对于任何企业级应用的开发者都是绝好的启发。

1.1 企业级应用简介

企业级应用面临系统数据量超大、并发用户数量多等问题,而且企业级应用涉及大量外部资源,往往还需要整合不同平台的系统,这都给企业级应用开发带来巨大的挑战。但企业级应用的应用面非常广泛,这就使得企业级应用开发非常活跃。下面简要介绍企业级应用开发的基础知识。

1.1.1 企业级应用简介

企业级应用(Enterprise Applications)是指为电信、银行、证券等大型商业组织、大型企业创建并部署的解决方案及应用。由于企业级应用往往是企业信息化的基础,因此,企业级应用又称为企业信息系统(Enterprise Information System),有时候也称为管理信息系统(Management Information System)。

企业级应用的主要作用就是以硬件、软件设备来加强企业的信息管理,从而为企业的运行提供支撑,不断提高企业的管理水平和经济效益。

简而言之,企业级应用就是管理企业信息的系统。对于企业级应用而言,应用里包含的信息(也就是数据)是企业最宝贵的财富,而企业级应用则是这些信息的载体(如同传统的纸质媒体一样)。除此之外,企业级应用还负责加工处理已有数据,让企业中各工作人员能以最简洁的方式查看到各自应该看到的信息;更高智能的企业级应用,还可以对已有数据进行分析、挖掘,提供未来的决策支持。

企业级应用通常会涉及持久化数据,这是企业信息化系统的必要步骤。企业信息被转换成计算机里的数据,通过数据库持久存放,这个过程被称为持久化。

对于一个企业而言,企业级应用里包含的数据往往比最初支撑它们的硬件系统、操作系统和软件系统寿命还要长。甚至于,一个企业的数据是整个企业运作的命脉。企业的硬件可以购买,软件系统也可以升级,但系统里的数据无法升级,无法舍弃。

企业活动是非常频繁、数据量非常密集的活动,因此企业级应用一般都涉及大量数据。这些数据在数据库中以大量的数据表、数据记录的方式存在,这就是企业级应用的核心:数据库。数据库在企业级应用中处于重要的地位。选择性能优良的数据库和有效地使用数据库,是开发企业级应用的一项核心工作!

因此,有人说:所谓企业级应用就是对数据库的操作。如果非要这样说,也未尝不可——但除了基本的数据操作之外,建立在数据操作之上的业务逻辑才是企业级应用更需要面对的挑战。

企业级应用往往拥有大量的用户,例如电信部门的的话费支撑系统,需要同时支撑成千上万用户的电话计费。除此之外,企业级应用还需要大量的用户界面,这些用户界面需要面对大量没有技术背景的用户,这些用户的操作可能是千奇百怪的,这些操作给企业级应用的安全带来挑战。

企业级应用也很少单独存在,通常需要与企业的合作伙伴的企业级应用集成。不同企业的系统往往风格迥异,操作系统可能不同,开发语言也可能存在差异,企业级应用就需要提供对这种异构系统整合的能力。

1.1.2 开发企业级应用面临的挑战

企业级应用的开发是相当复杂的,这种复杂除了上面所介绍的技术方面的复杂外,还有行业本身的复杂。企业级应用进入的每个行业各不相同,每个行业的行业规则存在很大差异,从而导致各行业的应用往往差别非常大。优良的企业级应用往往需要丰富的行业知识,企业级应用的开发成功,需要有很多人的共同协作。

除此之外,企业级应用还面临如下方面的挑战。

1.频繁变更的软件需求

从事了多年软件开发,经常听到开发者的抱怨:需求又要改变,一切又要重来!这确实是一件让人沮丧的事情。当开发过程进行到中间时,大量的工作需要重新开始,确实给人极大的挫败感,软件开发者难免会抱怨。

但是,市场是瞬息万变的,企业也是随之而变的。信息化系统为企业服务,随着企业需求的变化,企业应用的变化也是必然的。

事实上,我们应该换一个角度来看待需求变化的软件:需求变更表明市场旺盛——只有有变化的产品才是市场需要的产品。因此,作为企业级应用,不但要有强大的功能,还要能够满足未来业务需求的变化,易于升级和维护。

优秀的企业级应用必须具备良好的可扩展性和可伸缩性。良好的可扩展性允许系统动态增加新功能,而不会影响原有的功能。良好的可扩展性建立在高度的解耦之上。使用Delphi,PowerBuilder等工具的软件开发人员对ini文件一定不会陌生,使用ini文件就是一种基本的解耦方式。将运行所需资源、模块的耦合等从代码中分离出来,放入配置文件管理是一种优秀的设计思路,最理想的情况是允许使用可插拔的模块(类似于Eclipse的插件方式)。

2.稳定、高效的运行

企业级应用还有个显著特点就是并发访问量大,访问特别频繁。稳定、高效是企业级信息化系统必需的要求。

企业级应用必须有优秀的性能,例如采用缓冲池技术。缓冲池专用于保存那些创建开销大的对象。如果对象的创建开销大,花费时间长,将这些对象缓存,可避免重复创建,从而提高系统性能。典型的应用是数据连接池。

提高企业级应用的性能的另一个方法是数据缓存。数据缓存有好也有坏:数据缓存在内存中,可极大地提高系统的访问速度;另一方面,缓存的数据占用了相当大的内存空间,这又会导致系统的性能下降。因此,数据缓存必须根据实际硬件设施指定,最好使用配置文件来动态管理缓存的大小。

3.时间、人力上的限制

如果时间没有限制,人力、财力的投入是无限的,任何一个软件系统在理论上都是可实现的。但这样的条件是不存在的,所有的软件产品都必须及时投放市场。

对于企业级应用,时间的限制则更加严格。正如前文介绍的,企业的信息是瞬息万变的,与之对应的系统必须能与时俱进。如果开发时间拖得太长,则系统的需求变化将会更加巨大,甚至会完全背离设计的初衷。

因此,企业级应用的开发必须保证在快捷、可控条件下进行。软件开发人员常常乐于尝试各种新的技术,总希望将它们带入项目的开发中,因而难免使整个项目陷入危险的境地。

当然,采用更优秀、更新颖的技术,通常可以保证软件系统的架构更加优秀,性能更加稳定。例如从早期的C/S架构向B/S架构的过渡,以及从Model 1到Model 2的过渡等。这些都提高了软件系统的可扩展性、可伸缩性。

但采用新技术带来的风险也是不得不考虑的,开发架构必须重新论证,开发人员必须重新培训,这都需要成本投入。如果整个团队缺乏对技术有通盘把握的领导者,项目的开发难免陷入技术难题,从而导致软件的开发过程不可控——这是非常危险的事情。

成功的企业级应用往往是在良好的可扩展性、可伸缩性和可控性之间的折中。

事实上,软件开发是一种“两害相权取其轻”的艺术,在简单与复杂之间权衡,在一种方案与另一种方案之间权衡,如果把每个问题、每个权衡的利弊都考虑得清清楚楚,恐怕开发一个应用程序的成本会高得惊人。因此大部分时候,我们宁愿采用一种不是那么先进,但有稳定保障的开发架构,这样更能保证系统可控和快捷开发。

1.1.3 Java EE开发平台简介

为了满足架构企业级应用的需求,Sun公司在早期的J2SE(Java 2 Platform Standard Edition)基础上,针对企业级应用的各种需求,主导并创造了J2EE(Java 2 Platform Enterprise Edition)开发平台(也就是后来的Java EE,2006年Sun公司将原有的J2EE改名为Java EE)。

Sun推出J2EE的目的是为了克服传统Client/Server模式的弊病,迎合Browser/Server架构的潮流,为使用Java技术开发服务器端应用提供一个平台独立、可移植、多用户、安全和基于标准的企业级平台,从而简化企业应用的开发、管理和部署。

J2EE平台提出的种种理论、建议迅速规范了企业级应用的开发,使得各个平台开发商按照J2EE规范分别开发了不同的J2EE应用服务器,J2EE应用服务器是J2EE企业级应用的部署平台。

图1.1显示了经典J2EE企业级应用的应用架构。

图1.1 经典J2EE应用架构

从图1.1中可以看出:经典的J2EE架构主要依赖于EJB组件构建。在经典的J2EE应用架构里,Entity EJB提供ORM支持,以面向对象的方式来操作数据库,而Session EJB则提供Entity EJB正面包装,对外提供服务,J2EE应用要求所有EJB组件都在EJB容器中运行。

注意 ORM的全称是Object Relation Mapping,即对象关系映射。因为现阶段的编程语言都是面向对象的程序设计语言,而底层的数据库却是关系数据库,为了解决面向对象程序设计语言和关系数据库之间的矛盾,就出现了ORM框架,ORM框架实际上是面向对象程序设计语言和关系数据库之间的桥梁。

在EJB服务之外,客户端可以是多种形式:既可以是Web应用的形式,也可以是Applet客户端的形式,还可以是Application客户端的形式,这些客户端形式都依赖于底层的EJB服务。

EJB 2.0规范在原有的EJB 1.0规范基础上新增了CMP(容器管理持久化)EJB,而且新增了MDB(消息驱动EJB)。但依然有众多开发者感到基于EJB的应用过于庞大,而且开发周期过长。

为此,Java阵营出现了两个基于POJO(普通、传统的Java对象)的框架:Hibernate和Spring。这两个框架极大地简化了企业级应用的开发,在基于Spring和Hibernate的J2EE应用里,Spring充当整个应用的IoC容器,负责管理容器中的所有业务组件。这些业务组件主要包括两种类型组件:DAO组件和业务逻辑组件。它们实际上对应传统的Entity EJB和Session EJB组件。

图1.2显示了基于Spring和Hibernate的Java轻量级企业级应用架构。

图1.2 轻量级Java EE企业级应用架构

2006年5月,Sun推出了Java EE 5规范。Java EE 5规范实际由原来的J2EE 1.4规范升级而来,它吸收了Spring,Hibernate等框架的优势,充分简化了企业级应用的开发,将原来复杂的EJB组件改为基于POJO的实现,而且充分利用了Java注释的优势,简化了XML配置。

随着Java EE 5规范的推出,很多Java领域的开发者又开始回归经典的Java EE开发平台。

1.1.4 .NET开发平台简介

根据来自Microsoft的官方说法,Microsoft .NET是Microsoft XML Web Services平台。XML Web Services允许应用程序通过Internet进行通信和共享数据。它的优势是无须理会异构系统采用何种操作系统、何种设备、何种编程语言,Microsoft .NET平台提供的XML Web Services都可将这些系统整合起来。

.NET开发平台向人们描绘了一个无比美好的前景:网络就是操作系统!当用户需要使用任何信息或者应用程序时,都可以直接访问这些信息或程序,而无须理会它们的实际物理位置。从这种描述中不难看出,.NET的目的似乎是产生下一代基于网络的操作系统。

实际的情况是,Microsoft向人们描绘了.NET开发平台的美好未来,但这更多反映的是Microsoft在争取市场份额上的决心。

而.NET开发平台在企业级应用支持上主要体现为ASP.NET。与传统的ASP技术相比,ASP.NET革命性地提出了服务器组件的概念,这种服务器组件允许开发人员以传统的C/S应用的编程模式来开发B/S结构应用。

ASP.NET提供了丰富的服务器组件,这些服务器组件极大地简化了企业级应用的开发。

除此之外,.NET平台提供了ADO.NET来完成数据持久化。ADO.NET是对Microsoft ActiveX Data Objects(ADO)的改进,它提供了平台互用性和可伸缩的数据访问。由于传送的数据都是XML格式的,因此任何能够读取XML格式的应用程序都可以进行数据处理。

事实上,接受数据的组件不一定是ADO .NET组件,它可以是基于一个Microsoft Visual Studio的解决方案,也可以是运行在其他平台上的任何应用程序。

因此,.NET平台也是企业级应用开发平台的一个选择。实际上,中小型的企业级应用可能更倾向于使用.NET开发平台。

1.1.5 Ruby on Rails开发平台简介

Ruby on Rails开发平台无疑是企业级应用开发平台的“黑马”,它几乎是笔者见过的最快的开发平台,提供了一种更容易开发、配置和管理Web应用程序的框架。

虽然很多地方把Ruby on Rails称为一种MVC框架,但事实上,相对于Java领域的MVC框架Struts,WebWork和Tapestry等,Ruby on Rails远远超出了MVC框架层次,它提供了Web应用开发的全套解决方案。

从某种程度上来看,Ruby on Rails相当于Java领域多个框架的组合:ActiveRecord的作用类似于Hibernate,提供了持久层解决方案;ActionController相当于Struts,提供了控制器解决方案,而RHTML则相当于一个模版框架,如FreeMarker,提供了表现层解决方案。

在这种模式下,整个Web应用被严格分为三个部分:Model,View和Controller。Ruby on Rails为MVC模式下的每个组件都提供了简洁的解决方案。

除此之外,Ruby语言的简洁性也为Ruby on Rails的快捷提供了支持。相对于Java等静态的面向对象编程语言,Ruby这种动态的面向对象编程语言的语法更灵活,编程效率更高。

熟悉轻量级Java EE应用架构的读者不难发现,Ruby on Rails框架的很多地方与Java EE应用架构非常相似。从某种程度上来看,Ruby on Rails框架是一个精简版的Java EE应用架构,它简化了Java EE应用的架构:把Java EE应用架构中的富领域对象、业务逻辑组件和DAO组件三者合一。在Ruby on Rails应用中,Model对象是一个富领域对象,可以作为业务逻辑组件使用。该对象继承了ActiveRecord,因此也提供了Java EE应用中DAO组件的功能。这大大简化了Ruby on Rails应用的开发。

除此之外,Ruby语言提供的混入(Mixin)机制,分离了控制器和Model之间的耦合,提高了应用的可扩展性和可维护性。

1.2 Ruby on Rails概述

前面简单介绍了Ruby on Rails开发平台的优势:因为Ruby是一种动态的面向对象程序设计语言,因此提供了非常高效的开发效率。实际上,Ruby on Rails由两个概念组成:Ruby是一种简单的编程语言,而Rails则是一个Web开发框架。这就为整个Web应用提供了一种“一站式”解决方案。

因为Rails框架是使用Ruby语言开发的,而且使用Rails框架开发的Web应用也是基于Ruby语言的,因此我们称这种平台为Ruby on Rails。Ruby on Rails是一种快速而优秀的开发平台,为快速开发优秀的企业级应用提供了保障。

1.2.1 什么是Ruby

Ruby语言由日本人松本行弘(まつもとゆきひろ,英译:Yukihiro Matsumoto,外号matz)于1993年开始着手研发,经历2年时间后他发布了Ruby语言的第一个版本0.95版。据松本行弘描述,他一直想发明一种语言,这种语言既能进行高效开发,又能让开发人员享受编程的快乐。

事实上,Ruby确实是一种非常简洁的解释性语言,它是一种纯粹的面向对象程序设计语言,甚至比Java更纯粹(在Java语言里,还有基本数据类型等不是对象的变量,但在Ruby语言里,一切都是对象)。除此之外,Ruby还提供了许多额外的便捷功能:闭包、迭代和集合等。这些都是为了实现Ruby语言创始人的梦想:让Ruby开发者能享受编程的快乐。

相对于Java,C#等静态语言需要先编译后运行,Ruby语言是一种解释型语言,类似于PHP,Perl。但它又是完全面向对象的,因此程序中的所有变量都是对象(包括5,‘a’这种数值、字符常量)。

Ruby语言创始人松本行弘创立Ruby时努力提高编程效率(注意:不是程序的运行效率),并且强调程序开发者的快乐。他认为:过去的软件工程师,常常从机器方面着想,他们认为这样做,机器就能运行得更快;这样做,机器运行效率更高;这样做,机器就会怎样怎样。但Ruby的创始人认为:编程语言需要从人的角度考虑问题,即人们怎样编写程序或者怎样使用机器上的应用程序。程序开发者才是主人,电脑是仆人。

因此,松本行弘在设计Ruby语言的过程中,非常重视该编程语言的人性化,并且提供良好的运行界面。遵循上述的理念,Ruby语言的语法非常直观,甚至有点像以自然语言的方式进行编程。从某种程度看,使用Ruby编程就像写文章一样。

相对于传统编程语言,Ruby提供了如下几大特点:

❑ 强大的面向对象支持。它提供普通的面向对象功能,如类、实例和方法调用等;也提供特殊的面向对象功能,如Mixin,迭代器等特殊方法,也提供闭包支持。

❑ Ruby是动态语言。因此它可以在程序中动态修改先前定义过的类,也可以在某个类的实例中定义该实例特有的方法,这种方法被称为单例方法。

❑ 可移植性好。不仅可以运行在大多数UNIX操作系统上,还可以运行在DOS,Windows,Macintosh和BeOS等操作系统上。

❑ Ruby是一种弱类型的语言。变量无须声明,变量没有类型。Ruby的变量可以保存任何类型的数据。

❑ 支持自动垃圾回收机制,避免程序员手动回收垃圾。

❑ 提供完善的异常处理机制,保证了Ruby程序的健壮性。

❑ 提供了巨大的标准库,使用非常方便。

❑ 简单的语法。提供正则表达式支持,并支持运算符重载。

❑ 清晰的命名规则。Ruby的变量命名必须遵守固定规则:以$开头的一定是全局变量,以@开头的都是实例变量,而以@@开头的是类变量。常数则以大写字母开头。

❑ 动态载入,运行时取决于所运行的操作系统。

❑ 完全免费。

基于Ruby语言的简洁性,使用Ruby进行软件开发是一件非常快捷、高效的工作。

1.2.2 什么是Rails

Rails是一个相对较新的Web应用程序框架,构建在Ruby语言之上。作为企业级应用开发平台的“黑马”,它被宣传为现有企业级应用框架的替代。它的目标,就是最大程度地简化Web应用的开发。

Rails是一个基于Ruby的开源Web框架,通过使用Rails框架的支持,可以更快捷地开发出Web应用。Rails框架提供了开发Web应用的一站式选择。

除此之外,Rails框架完全继承了Ruby语言的设计宗旨,让开发更加简洁,让整个应用的开发更加人性化。为此,Rails提供了一条规则:约定优于配置。Rails框架提供了大量约定,只要开发人员按这种约定进行开发,就可以省略很多步骤,例如Java EE应用中大量的配置文件。当然,Rails框架也允许开发者重新定义自己的配置,让配置来覆盖Rails的配置。

Rails框架包括WEBrick服务器、处理HTTP请求和响应的MVC框架,以及把数据持久存储的框架。Rails使用约定来消除复杂的XML配置文件,使用Ruby语言的动态性质把静态类型语言中常见的大量重复代码减到最少,努力使开发工作变得更容易。

1.2.3 Ruby on Rails的发展现状

Ruby on Rails是一个非常年轻的框架,自2005年初问世以来,只经历了短短的2年多时间,但已经在Web应用开发平台上引起了强烈反响,吸引了众多企业级应用开发者的目光。

目前,美国的很多软件公司,早已开始使用Ruby on Rails来作为企业级应用开发平台。实际上,本书的作者之一郭秋霞女士是美国Reactrix公司的Ruby on Rails项目组成员,据她的一些美国朋友介绍,在他们国家,Ruby on Rails的上升趋势甚至超过了Java EE开发平台的上升趋势。

在国内,也有越来越多的企业应用开发者加入了Ruby on Rails开发阵营,国内的Ruby on Rails社区也逐渐热闹起来,这是Ruby on Rails大规模进入企业级开发的前奏。

但国内暂时还未见到Ruby on Rails大规模进入企业级开发,这可能跟如下几个方面的原因有关:

❑ Ruby on Rails的资料还不是相当系统、不是非常全面,这影响了众多学习者的学习。

❑ Ruby on Rails的中文支持比较麻烦,特别在Windows操作系统中使用GBK编码方式来解决中文化问题比较复杂(在Linux下使用UTF-8来解决中文问题就相对简单一点)。

❑ 国内的技术发展通常比国外稍微缓慢一点。

基于上面三个原因,Ruby on Rails开发平台还未大规模地在企业级开发中使用。但是,一来国内的技术走向总是会以国外技术走向为准,二来Ruby on Rails在国内已经获得了大量拥护者,因此相信Ruby on Rails马上就要大规模地应用于企业级应用开发了。

1.2.4 Ruby on Rails与现存企业级应用平台的对比

前面已经介绍了目前流行的,目前最主流的企业级应用的开发平台就是Java EE开发平台和.NET开发平台。

.NET开发平台更多地是体现了微软的一种市场战略,而不是技术优势。在笔者看来,微软的.NET平台更像一句口号,而不是一种平台。实际上,不管是.NET提供的ASP.NET技术,还是.NET提供的WinForm技术,都更多地关注在系统的界面实现上(当然,也提供MVC模式的实现),却都没有提供ORM持久化解决方案。

再加上微软的.NET平台不够开放,而且作为企业应用使用时需要支付相关费用,这都导致.NET开发者不够活跃,因此,支持.NET平台的框架也不是特别丰富。简而言之,.NET平台由微软一个公司维护。

相反,Java EE开发平台则是开放的,从来没有任何语言像Java这样活跃过,几乎每隔几天时间就会有一个新的Java框架发布。大量优秀的Java框架已经过多年检验,而且支撑着目前的绝大部分企业级应用,例如Struts,WebWork,Tapestry,FreeMarker,Spring,Hibernate和iBATIS等。

Java开发领域是一个非常有趣的开发领域:Java语言是如此简单,又是如此之难!在多年的开发经历中,笔者无数次见到一些有多年开发Java经验的程序员甚至连接口都搞不清楚,一直在重复JSP编码,也称自己是Java EE开发者。更甚至于当笔者成为新东方广州中心软件教学总监后,在招聘教师时,多次面试各大公司具有多年Java开发经验的技术经理,让他们临时写一个小小的Socket通信程序、或者一个简单应用,他们也觉得困难重重。

Java语言太庞大了,它提供给开发者太多选择。事实上,Java已经远远超出了一门语言所能涵盖的概念,它是一种平台,一种理念,甚至是一块试验田:只要在软件开发领域出现任何一种新的软件开发理念,很快就在网上出现相应的开源实现——这是Java永远的魅力,这是笔者一直深爱Java的原因。

如果你是一个深爱研究软件设计、软件架构的人,那么你应该进入Java领域。因为有一句名言:代码就是文档。Java领域如此丰富的开源框架、如此迅速的更新速度几乎涵盖了软件开发领域最新的开发理念,我们很容易通过阅读这些框架看到最新的软件开发理念,这对于软件开发人是一种诱惑!

但这也正是Java EE开发平台的问题:它太庞大了,以至于让人无所适从。Java EE开发平台提供了太多选择:当我们需要开发一个应用时,我们可以选择不同技术来组合实现,每种技术又有多种备选方案。开发人员到底该选择什么呢?

这可能造成一个很大的问题:很多开发者都在做Java EE开发,却连接口都搞不清楚,因为他们虽然号称做Java EE开发,其实只是一个JSP脚本编写者,更不可能全方位地考虑整个应用的各种问题。

而且,没有一个Java EE框架提供了“一站式”服务。即使是Spring框架,虽然号称提供了“一站式”解决方案,但依然没有提供底层的ORM框架。因此开发人员还是面临到底选择Hibernate,还是JDO,或是iBATIS的问题。

但Ruby on Rails框架不一样,它极其完备,提供了企业级应用的完整解决方案,对Web服务器、处理HTTP请求和HTTP响应的前端MVC框架、底层的ORM解决方案,Ruby on Rails都提供了一站式解决。

使用Ruby on Rails框架来开发企业级应用更加简单,开发者无须理会其他框架,无须担心Ruby on Rails和其他框架的整合问题。而且Ruby on Rails模仿了Java EE应用架构的设计理念,但又简化了开发Java EE应用的烦琐:Ruby on Rails通过提供大量的约定来代替Java EE应用中烦琐的XML配置。

从某种程度上来看,Ruby on Rails框架是一个简化版的Java EE开发平台,它的核心架构仍然遵循在Java EE中发现的基本模式,但更加简洁。也许我们可以这样说:Ruby on Rails平台是面向用户的,它更多地关注如何简化开发;而Java EE平台则是面向程序员的,它更多地关注如何体现最新的软件设计理念。

1.3 Ruby on Rails体系介绍

前面大致介绍了Ruby on Rails的开发优势,本节将从Ruby on Rails的框架体系方面进行介绍,让读者对Ruby on Rails的框架体系有整体的把握。在介绍Ruby on Rails体系的同时,也会将之与比最流行的Java EE应用架构相比,希望给有Java EE开发经验的读者以启发。

1.3.1 Ruby on Rails架构模型

Ruby On Rails框架提供了开发企业级应用的全部解决方案,这一点也是Ruby on Rails能吸引开发者的重要原因。

Ruby on Rails提供了开发企业级应用所必需的全部功能:Web服务器、处理HTTP请求和HTTP响应的MVC框架、处理底层数据持久化的ORM框架。而这些服务,在轻量级Java EE应用中都有相应的实现,而且每种服务都有超过一种的选择。

Ruby on Rails通过大量约定,简化了Java EE应用中的XML文件配置,但即便如此,我们依然可以看出Ruby on Rails和Java EE应用的较大类似性。

图1.3显示了Ruby on Rails框架的架构模型。

图1.3 Ruby on Rails应用的架构

从图1.3中不难看出,Rails框架主要由如下4个部分组成。

(1)WEBrick服务器:这是所有Web应用的基础。WEBrick服务器主要用于提供底层的Socket连接和多线程的服务。通过WEBrick服务器的支持,允许Web应用开发者无须关心底层的Socket通信机制,无须理会多线程等,就可以开发Web应用。

(2)RHTML页面:这是一种功能强大的模板页面,它是Ruby on Rails的视图层技术,包括负责收集用户输入的表单页,以及包含显示处理结果的显示页。

(3)ActionController:这并不是一个类,而是一个模块,该模块里包含了一个Base类,Base类是所有控制器的父类。因此图1.3将ActionController画成系统的控制器,该控制器向上负责为RHTML页面提供服务,向下调用ActiveRecord的方法来处理用户请求。

(4)ActiveRecord:这是Ruby on Rails的核心,也是Ruby on Rails应用中最复杂的组件,它合并了Java EE应用中的三个成员——富领域对象、业务逻辑组件和DAO组件,因此功能非常丰富。

学习Ruby on Rails开发主要就是学习如何使用ActionController里的控制器方法来取出请求参数,并调用ActiveRecord组件里的业务逻辑方法,再根据不同的领域模型来建立相应的ActiveRecord Model对象。

图1.4显示了Java EE应用的架构示意图。

图1.4 Java EE应用的架构示意

对比图1.3和图1.4不难发现:Ruby on Rails和Java EE应用架构如此相似,如果把Java EE应用架构中的业务逻辑组件、DAO组件和富领域对象三者合一,就完全变成了Ruby on Rails的应用架构。

1.3.2 富领域对象

富领域对象的英文名称是Rich Domain Object,它指的是企业级应用中具有业务逻辑功能的模型对象。

富领域对象是伴随着面向对象设计的逐渐完善而出现的概念。在早期的面向对象建模里,对每个业务实体,程序中通过一个Model对象来定义,而该Model对象仅包含了该对象的系列属性,以及每个属性的setter和getter方法,这种Domain Object只是单纯的数据体,类似于C的数据结构。虽然它的名字是Domain Object,却没有包含任何业务对象的相关方法。

伴随面向对象建模的发展,开发人员一致认为:这是一种不健康的建模方式,Domain Model既然代表了业务对象,就应该包含相关的业务方法。传统的领域对象没有包含任何业务逻辑方法(所有业务逻辑方法都是放在业务逻辑组件中实现的),因此这种领域对象被称为贫血模型对象。

后来,开发人员一致认为:贫血的Domain Object实际上以数据结构代替了对象。而Domain Object应该是个完整的对象,既包含基本的数据,也包含了操作数据相应的业务逻辑方法——这个对象就是富领域对象。

实际上,后来的Java EE应用也大都开始采用富领域对象的缄默方式。

Ruby on Rails里的Model对象天生就是富领域对象,因为Ruby on Rails没有业务逻辑组件这个概念,Ruby on Rails的每个模型都负责实现相关业务逻辑方法,因此每个Model对象就是一个富领域对象。

1.3.3 持久层解决方案:ActiveRecord

ActionRecord是Ruby on Rails框架的核心,它既是Ruby on Rails框架的持久层解决方案,也是Ruby on Rails应用的富领域对象的基类。

在持久层解决方案上,ActiveRecord的领域对象看上去有一定的代码污染(必须继承Ruby on Rails框架的持久层基类),但这种代码污染是值得的,因为它简化了数据持久化的操作。

图1.5对比了ActiveRecord和Hibernate持久化的差别。

图1.5 ActiveRecord和Hibernate持久化的差别

从图1.5中可以看出:Hibernate的持久化对象继承的是Object类,这意味Hibernate的持久化对象实际上没有任何持久化能力。事实上,Hibernate的持久化对象必须处于Hibernate Session的管理下才可以进行持久化。

而Ruby on Rails的持久化对象继承了ActiveRecord的Base类,该Base类包含了多个持久化方法,这意味着Ruby on Rails的持久化对象自身就具有持久化能力。

而且,Ruby on Rails应用里的持久化对象非常简洁:

        # 建立一个持久化对象
        class User < ActiveRecord::Base
        end

一旦建立了该持久化类,该持久化类就自动具有了如下几个类方法。

❑ find(*args):根据主键查询特定记录。

❑ find_by_sql(sql):根据SQL语句查询。

❑ exists?(id):判断指定ID的记录是否存在。

❑ create(attributes):新增一条记录。

❑ update(id, attributes):根据ID来修改指定记录。

❑ update_all(updates, conditions):根据条件来修改一批记录。

❑ delete(id):删除指定ID的记录。

❑ delete_all(conditions):根据条件来删除一批记录。

当在Ruby on Rails框架中建立User类时,Ruby on Rails框架将根据约定将该持久化类映射到特别数据表,并把该数据表中每列映射成相应属性,通过这种方式就可以避免书写烦琐的XML映射文件(当然,Ruby on Rails也允许开发者覆盖这种约定)。

1.3.4 控制器解决方案:ActionController

对于Java领域的MVC框架,如Struts和WebWork等框架,当系统拦截到用户请求时,并不知道调用哪个控制器来处理用户请求,因此开发人员必须在配置文件中具体配置每个Action,每个Action都有指定的URI,系统根据这个URI决定由哪个Action处理哪个用户请求。

而Rails采用了不同的方式,它无须使用任何配置文件,它使用约定:用户请求的URL决定了调用哪个控制器方法。通过这种方式省略了Java EE应用中的配置文件。

除此之外,Ruby on Rails的控制器与Java EE应用的控制器还存在一个显著差别:Ruby on Rails的一个控制器可以包含多个处理逻辑,而Java EE应用的一个控制器通常只存在一个处理逻辑。

图1.6显示了ActionController和Struts两种MVC框架的对比。

图1.6 ActionController和Struts的MVC对比

从图1.6中可以看出,Ruby on Rails只需要一个控制器就可以完成的工作,Struts却需要三个甚至更多的控制器。

除此之外,Struts要求在struts-config.xml中分别配置每个Action,并配置每个Action的URL,这都需要完成大量烦琐的XML配置。

而Ruby on Rails采用完全不同的策略。它根据用户请求来决定调用哪个控制器,例如对于URL为http://localhost/UserController/delete/的请求,Ruby on Rails知道调用UserController控制器的delete方法——这是一种约定,省去了大量XML配置文件的烦琐。

从图1.6中可以看出,Ruby on Rails中的控制器必须继承ActionController::Base。Ruby on Rails并不创建ActionController的实例池,相反,它为每个请求创建新的实例。这种做法虽然可能对性能有一定影响,但是它可以让开发变得更容易。开发人员不需要关注Rails中存在的线程安全问题,因此,会话、请求、标题和参数都可以作为ActionController的实例成员来进行访问。

ActionController这种组合多个控制处理逻辑的策略,还有一个额外的好处:可以将特定域逻辑的所有处理组合在一起,从而提供一种Web模块的功能。

总结来讲:Java EE应用里的控制器都是细粒度的,它提供了非常具体的工作单元,每个控制器对应一个控制逻辑;而Ruby on Rails的ActionController则是粗粒度的,它将具体的工作单元定义成一个方法,而每个ActionController则对应为一个Web模块。

1.3.5 表现层技术:RHTML页面

Ruby on Rails还提供了一个功能非常强大的表现层技术:RHTML页面。这种RHTML技术非常类似于传统Java EE应用的JSP页面,用于生成Ruby on Rails的表现层。

实际上,与其说RHTML页面像JSP页面,不如说RHTML页面类似于另一个Java EE模板框架FreeMarker。相对于JSP页面,RHTML是更加纯粹的表现层,可以避免开发者将过多的业务逻辑插入RHTML页面。

除此之外,RHTML页面中还可使用大量功能丰富的帮助方法,这些帮助方法用于简化表现层页面的创建。这些帮助方法非常类似于JSP页面中的标签——通过一个简单的帮助方法,底层可以隐藏复杂的显示逻辑。

不仅如此,RHTML页面还支持页面装饰技术,这一点非常类似于Java EE领域的另一个开源框架:SiteMesh。通过使用RHTML页面的页面装饰技术,允许开发者在定义RHTML页面时只关心实际的表单和数据输出,而无须理会页面美观、页面效果。一旦开发者开发了完整的应用,美工人员就为整个站点编辑装饰器页面,或者为特定模块编写特定的装饰器页面,从而保证整个应用、整个模块有相同的视觉风格。

与SiteMesh需要使用decorators.xml文件来定义装饰器页面不同,Ruby on Rails采用约定来定义装饰器页面:Ruby on Rails应用的装饰器页面都放在Web应用的app\views\layouts路径下,装饰器页面也是一个RHTML页面。例如在app\views\layouts路径下的admin.rhtml页面,默认装饰该应用下的admin模块,即位于app\views\admin模块下的所有RHTML页面都使用admin.rhtml页面来装饰。

1.4 搭建Ruby on Rails开发和运行环境

经过前面介绍,我们已经对Ruby语言和Rails框架有了一个大致认识,而且对Ruby on Rails开发平台和Java EE开发平台进行了类比。通过这种类比,希望让读者对Ruby on Rails开发平台建立一个整体的认识。

下面主要介绍如何搭建Ruby on Rails的开发平台。

1.4.1 安装Ruby解释器

因为Ruby语言是一种解释性的语言,因此Ruby程序无须编译,直接使用Ruby解释器解释该程序即可。

安装Ruby语言解释器及相关内容请按如下步骤进行。

(1)登录http://rubyforge.org/projects/rubyinstaller/站点,下载Ruby的One-Click Installer的最新版,当前One-Click Installer-Windows的最新版是1.8.6-25,下载该版本的Ruby安装文件。

提示 如果读者无法上网,可以使用本书光盘tools/路径下的Ruby.rar文件,这个压缩文件既包含了Ruby解释器,也包含了Rails框架。将光盘tools/路径下的Ruby.rar文件解压缩到任意路径。以解压缩到D:盘为例,为了让操作系统能找到Ruby语言的解释器命令:ruby,还必须把ruby命令所在的路径添加到系统的PATH路径里,ruby命令在D:\ Ruby\bin路径下。

事实上,本书光盘中所有的代码都是基于该版本的Ruby on Rails框架建立的,如果读者在运行项目时出现任何问题,都建议使用该版本的Ruby on Rails平台。

如果要在Windows下添加环境变量,请在桌面单击“我的电脑”图标,弹出右键菜单,在右键菜单中单击“属性”菜单项,出现“系统属性”的对话框,在该对话框中单击“高级”选项卡,弹出如图1.7所示的对话框。

图1.7 “系统属性”对话框

单击图1.7中椭圆形框起来的“环境变量”按钮,出现如图1.8所示的添加环境变量的对话框。

图1.8 编辑环境变量的对话框

单击图1.8中上面的椭圆形框起来的“PATH”项,是编辑当前用户的环境变量;如果单击图1.8对话框中下面的椭圆形框起来的“Path”项,是编辑系统环境变量。读者可以任意选择编辑哪一个。

提示 系统环境变量优先于用户变量,且系统环境变量对机器中的所有用户都生效,用户变量只对当前用户生效。如果为了减少环境变量的影响范围,笔者已经将它们都添加在用户变量里,则该环境变量只对当前用户才生效。

单击图1.8中上面的“PATH”项,将看到如图1.9所示的“编辑用户变量”对话框。

图1.9 “编辑用户变量”对话框

在“变量值”文本框中添加D:\Ruby\bin路径,该路径就是本系统中ruby命令所在的路径。

如果读者使用本书光盘下tools/Ruby.rar文件,则按上面步骤解压缩,添加环境变量即可。但如果读者可以上网,而且坚持自己安装Ruby on Rails平台,则继续如下步骤。

(2)在步骤(1)的下载中应该得到一个ruby186-25.exe文件。当然,根据读者下载Ruby版本的不同,后面的版本号可能有一些小小的改变,这不会影响Ruby的安装。单击ruby186-25.exe文件,开始安装Ruby语言解释器,安装Ruby语言解释器与安装普通Windows软件并无太大差别;读者单击“Next”按钮,将看到Ruby语言解释器的协议对话框;读者单击“I Agree”按钮,同意该协议,然后看到如图1.10所示的组件选择对话框。

图1.10 Ruby选择安装组件

从图1.10中看到安装Ruby包含了4个选项,其中“Ruby”选项代表了Ruby解释器核心部分,是默认安装的,如果不安装该选项,其他选项都不能安装——也就是什么都没有安装。安装了Ruby解释器核心部分后,一定要选择安装RubyGems,这是后续安装Rails的关键!而SciTE是Ruby的编辑工具,安装与否无关紧要——这个工具的功能也不是很强大,比EditPlus强不到哪里去。

(3)单击图1.10中对话框里的“Next”按钮,开始进一步安装,此时选择Ruby的安装路径,笔者将Ruby安装在系统的D:盘下,两次单击“Next”按钮即开始安装。

注意 如果选择这种安装方式,读者无须手动添加环境变量,安装文件自己负责添加Ruby解释器所需的环境变量。当然如果系统依然提示找不到ruby命令,则用户需要手动添加环境变量。如果在DOS窗口下运行ruby命令不再出错,则表明Ruby语言解释器已经安装成功。

1.4.2 安装Rails

安装Rails之前,首先介绍一下Ruby语言的包管理器:RubyGems。RubyGems是最近渐渐在Ruby社区流行起来的包管理工具。以前,如果你要下载一个Ruby扩展或者应用程序,需要下载相应的zip包,然后解压缩,将应用或者扩展安装到Ruby对应的目录中——这是非常烦琐而且容易出错的事情,你可能弄不清楚这个扩展或应用程序需要依赖哪些包,可能弄不清楚应该安装到Ruby的哪个目录下。

但是有了新的RubyGems,所有这些麻烦都没有了,你只需要一条命令就可以从远程服务器上下载相应的包,如果相应的应用包含其他扩展,RubyGems也会提示你从远程安装所依赖的扩展。安装后RubyGems会运行相应的程序生成rdoc帮助文档(类似于javadoc)。

当然你也可以将软件包下载到本地,运行RubyGems的本地安装命令。有了RubyGems包管理器,Ruby应用的安装将变得前所未有地容易。

统一化的管理带来的好处就是简单。现在Ruby社区的应用都在朝着写RubyGems的方向发展。

熟悉Linux环境的读者可能比较熟悉RPM包,RubyGems的包管理器有点类似于RPM包,但它比RPM包更简单。RPM包还会提示安装自己下载所依赖的类库,而RubyGems包管理器则自动下载所需的依赖扩展。

因为前面安装Ruby时候已经选择了安装RubyGems,故此处可以使用它来安装Rails框架。RubyGems对应为一条gem命令,该命令有多个选项。

❑ gem -h/--help:显示RubyGems的帮助。

❑ em -v/--version:显示RubyGems的版本号。

❑ gem list:用子命令list列出本地安装的Ruby扩展包。

图1.11显示了本机当前已经安装的Ruby扩展包。

在如图1.11所示的DOS窗口中输入如下命令:

        #安装Rails框架
        gem install rails remote

图1.11 查看Ruby当前已经安装的扩展包

这条命令指定从远程服务器上安装Rails,当然这要求读者的机器已经接入了Internet网络。gem会自动从远程下载、安装Rails框架,省去了读者自己下载相应包、手动安装的烦琐。

成功安装Rails的界面如图1.12所示。

图1.12 成功安装Rails的界面

1.4.3 安装MySQL数据库

虽然Ruby on Rails也可以使用其他数据库系统,但Ruby on Rails推荐使用MySQL数据库系统。Ruby on Rails平台对MySQL数据库的支持最好,本书的所有示例都是基于该数据库系统构建的,因此推荐读者安装MySQL数据库系统。

在Windows平台上下载和安装MySQL数据库系统请按如下步骤进行。

(1)登录http://www.mysql.org/downloads/mysql/5.0.html#win32站点,下载MySQL数据库的最新版。笔者成书之时,MySQL数据库的最新稳定版本是MySQL5.0.20,建议下载该版本的MySQL安装文件,建议下载Windows平台的第二个选项:Windows ZIP/Setup.EXE(x86)。

提示 如果读者使用的是64位的电脑,则应该下载Windows ZIP/Setup.EXE(AMD64 / Intel EM64T)项。

(2)下载完后,得到一个mysql-5.0.20-win32.zip文件,将该文件解压缩,可以看到一个名为Setup.exe文件,这就是MySQL的安装文件。单击Setup.exe文件,开始安装MySQL数据库系统,安装MySQL数据库系统与安装普通Windows软件没有太大差别。

(3)开始安装MySQL后,在出现的对话框中单击“Next”按钮,可以看到如图1.13所示安装选项对话框。

图1.13 自定义安装MySQL数据库

(4)单击图1.13所示对话框的“Next”按钮,将出现选择安装组件和安装路径的对话框。笔者把MySQL安装在D:盘下,并且选择安装所有组件,如图1.14所示。

图1.14 安装所有组件

(5)单击图1.14对话框中的“Next”按钮,将开始安装MySQL数据库系统。当MySQL数据库程序安装成功后,系统还要求配置MySQL数据库。

成功安装了MySQL数据库系统后,弹出如图1.15的成功安装对话框。

图1.15 成功安装MySQL数据库

(6)在图1.15中有一个复选框,用于指示是否需要立即配置MySQL数据库服务。单击图1.15中的“Finish”按钮,将开始配置MySQL数据库。

(7)配置MySQL服务器将从图1.16开始,在图1.16中选择“详细配置”选项。

图1.16 选择“详细配置”

(8)单击图1.16所示对话框的“Next”按钮,将出现下一个对话框。在配置中将依次出现一系列的对话框,但这些对话框影响不大,直到出现如图1.17所示的选择字符集的对话框。

图1.17 选择MySQL字符集的对话框

(9)在如图1.17所示对话框中选择第3个选项,并在字符集的下拉列表中选择“gbk”选项。然后单击图1.17中的“Next”按钮,将看到如图1.18所示对话框。

图1.18 安装MySQL服务和添加mysql命令

(10)在图1.18中选择安装MySQL服务,并添加mysql命令,如图1.18所示。然后单击图1.18所示对话框中的“Next”按钮,将看到如图1.19设置root用户口令的对话框。

图1.19 设置root口令

(11)经过如上10个步骤,单击图1.19中所示的“Next”按钮,将进入MySQL配置的最后一个阶段。单击所出现对话框中的“Next”按钮,出现下一个对话框,再单击“Execute”按钮,就可完成MySQL的配置了。

1.4.4 Ruby on Rails相关开发工具

关于Ruby on Rails的开发工具,暂时还没有专门Ruby on Rails IDE(集成开发环境,如JBuilder和Eclipse等)工具,但这并不会影响我们来开发Ruby on Rails应用。

实际上,一个Ruby on Rails应用大致由两种形式的文件组成:Ruby源文件(后缀为*.rb的文件)和RHTML页面文件(后缀为*.rhtml的文件)。这两种文件分别可以使用不同的开发工具来开发。

Ruby源文件就是一个简单的文本文件,该文本文件可以使用任何的文本编辑器来编辑,包括最平常的“记事本”(但不要使用“写字板”来编辑,因为它是有格式的编辑器)。

对于Ruby源文件的编辑器,大致有如下几个选择。

❑ 使用SciTE工具:这是安装Ruby时自带的编辑器。

❑ 使用FreeIDE工具:这是安装Ruby时自带的编辑器。

❑ 使用EditPlus:这是功能强大的文本编辑器。

❑ 使用Eclipse:这是IBM旗下的Eclipse基金下的IDE工具,支持多种语言。

使用SciTE和FreeIDE来编辑Ruby源文件的方法大致相同,都提供了编辑Ruby源文件并解释Ruby文件的能力。除此之外,FreeIDE工具还支持建立Ruby项目的能力,不过实际使用起来,FreeIDE工具并不好用。

但使用SciTE工具就非常简单。单击D:\Ruby\scite\路径下的SciTE.exe文件,即可启动SciTE工具,启动该工具后即可看到一个文本输入框。

提示 SciTE只是一个简单的Ruby代码编辑器,提供了语法高亮等基本功能,并没有提供太多额外的功能。

单击SciTE窗口中的“File”菜单,然后单击“New”菜单项,创建一个新的Ruby源文件。一旦创建了新的Ruby源文件,将看到该工具中出现一个空白的编辑窗口。

在SciTE空白窗口中输入Ruby代码,再次通过“File”菜单将该源文件保存在任意路径。然后单击键盘上的“F5”按钮,将看到如图1.20所示的窗口。

图1.20 使用SciTE工具的效果

使用SciTE工具来编辑Ruby源代码非常简单,无非就是新建、打开Ruby源代码,运行Ruby代码(通过“F5”键完成)。

如果希望使用EditPlus来编辑Ruby文件,则需要对EditPlus进行一些额外设置,因为EditPlus默认不支持Ruby的编辑。

让EditPlus支持对Ruby源文件的编辑,请按如下步骤进行。

(1)先安装EditPlus主程序,安装EditPlus主程序与安装其他程序并没有太大差别。

(2)登录http://www.editplus.com/others.html站点,下载EditPlus的Ruby语法文件,下载该页面的ruby2.zip项目,这是一个较新的Ruby语法支持文件。

提示 如果读者无法上网,可以从光盘的tools/路径下取得ruby2.zip文件。

(3)将下载到的ruby2.zip文件解压缩,释放到EditPlus的安装路径。ruby2.zip文件里包含了两个文件:ruby.acp和ruby.stx文件,这两个文件分别是Ruby文件的自动完成文件和语法文件。

(4)启动EditPlus工具,在EditPlus的主菜单中单击“工具”菜单,然后单击“工具”菜单里的“参数”菜单项,出现如图1.21所示的对话框。

图1.21 为EditPlus增加Ruby语法支持

(5)单击如图1.21所示左边的“设置与语法”选项,看到设置不同类型源文件的语法文件和自动完成文件的对话框。单击图1.21对话框右上角的“添加”按钮,开始新增对Ruby源文件的支持,按如图1.21所示输入。输入完毕,即可完成EditPlus对Ruby的支持。

(6)再次单击EditPlus主菜单中的“工具”菜单,然后单击“工具”菜单里的“参数”菜单项,依然出现EditPlus的参数设置对话框,如图1.21所示。单击图1.21左边的“用户工具”选项,将看到如图1.22所示的对话框。

图1.22 配置运行Ruby程序的命令

(7)在如图1.22所示对话框的右上角单击“添加工具”按钮,添加一个用户自定义的新工具,该工具用于执行Ruby程序。因为运行Ruby程序所需的命令就是ruby,ruby负责解释当前文件即可。

经过上面的配置,即可在EditPlus工具中编辑Ruby源文件,并可以直接在EditPlus工具中解释Ruby程序。通过单击EditPlus的“文件”菜单来新建、保存Ruby源文件,然后单击“Ctrl + 1”键来解释执行Ruby程序,将看到如图1.23所示的界面。

图1.23 使用EditPlus来编辑和运行Ruby程序

使用Eclipse来开发Ruby应用同样需要安装Eclipse的Ruby插件,可以选择在线安装,也可以选择手动安装。

提示 关于如何安装Eclipse插件,可以参考笔者所著的《轻量级J2EE企业应用实战》一书。

在Eclipse下安装Ruby插件请按如下步骤进行(保证已经安装了Eclipse工具)。

(1)登录http://rubyeclipse.sourceforge.net站点,下载Eclipse的Ruby插件:RDT的最新版本。笔者成书之时,RDT的最新版本是0.9RC1,建议下载该版本的RDT插件。

提示 如果读者的上网条件不好,可以使用本书光盘的tools/路径下的org.rubypeople.rdt-0.9.0.200704141430RC1.zip文件,这个文件就是下载的插件文件。

(2)解压缩第(1)步中下载的org.rubypeople.rdt-0.9.0.200704141430RC1.zip文件,该文件将释放出两个文件夹features和plugins,从该文件结构可以看出,这是典型的Eclipse插件。

(3)本书采用扩展安装的方式来安装Eclipse的Ruby插件。在Eclipse安装路径下新建ruby文件夹,进入ruby文件夹,新建eclipse文件夹,将上面释放得到的features和plugins文件夹复制到该路径下。

(4)进入Eclipse安装路径下的links路径下(如果Eclipse安装路径下没有links文件夹,则手动创建一个links文件夹),新建一个插件链接文件,该文件的文件名是任意的,笔者建议取名为ruby.link,这是为了更好的可读性。在ruby.link文件内只有一行,该行指明该Eclipse的Ruby插件的安装位置:

        path=ruby

(5)启动Eclipse工具,单击Eclipse的“Window”菜单,然后单击“Window”菜单中的“Perferences”菜单项,将看到如图1.24所示对话框。

图1.24 Eclipse的“参数”对话框

(6)从图1.24中可以看出,在“参数”对话框左边的树状导航中已经看到Ruby节点,这表明Ruby插件已经安装成功。单击图1.24左边导航树的“Installed Interpreters”节点,为Eclipse设置Ruby的解释器。

(7)单击图1.24中右上角的“Add”按钮,将出现如图1.25所示的对话框。

图1.25 设置Ruby解释器安装路径

(8)单击如图1.25所示对话框右下方的“OK”按钮,返回如图1.24所示对话框,然后单击“OK”按钮,返回Eclipse主界面。

通过上面介绍的系列步骤,已经完成了Eclipse中Ruby插件的安装,然后就可以通过Eclipse来编辑和运行Ruby程序。单击Eclipse主菜单中的“File”菜单,在“File”菜单中单击“New”菜单项,将出现“New”菜单的二级菜单,在该菜单中可以看到“Ruby Project”和“Ruby Class”两项,通过这两项即可新建Ruby项目和Ruby类文件。

与Java技术相比,Ruby对名称和目录结构的要求宽松得多。在Ruby中创建一个项目实际上只是创建一个目录和一个.project文件,不再需要 .classpath文件,因为Ruby没有类路径。与Java技术相比,另一个显著差异是Ruby项目向导并不创建显式的src和bin目录,这是因为Ruby是解释语言,所以无须输出文件夹。

如果项目比较小,那么可以将Ruby源代码文件与项目文件放在同一个文件夹中,也可以创建自己的目录结构。与Java语言相比,Ruby不太关心目录结构。

图1.26显示了在Eclipse中编辑和运行Ruby程序的界面。

图1.26 使用Eclipse编辑和运行Ruby程序

编辑RHTML页面非常类似于编辑JSP页面,因此可以使用Dreamweaver工具来编辑该页面。Dreamweaver默认并不提供对RHTML文件的支持,为了让Dreamweaver支持RHTML页面,有如下两种方法。

由于RHTML页面和JSP页面的格式非常像,因此我们完全可以把RHTML页面当成JSP页面处理。为了让Dreamweaver把RHTML页面当成JSP页面处理,可以修改Dreamweaver安装路径下Configuration\DocumentTypes\路径下的MMDocumentTypes.xml文件,找到该文件中<documenttype id="JSP" .../>元素,该元素中包含了winfileextension="jsp,jst"和macfileextension="jsp,jst"两个属性值,修改这两个属性值,增加rhtml,即改为如下形式:winfileextension="jsp,jst,rhtml" macfileextension="jsp,jst,rhtml",就可以让Dreamweaver把RHTML当成JSP来处理,效果还可以。

除此之外,还可以通过安装Dreamweaver的Rubyweaver.mxp插件实现,安装插件按如下步骤进行。

(1)登录http://www.ridingtheclutch.com/站点,下载Rubyweaver.mxp插件的最新版本,如果成功下载,将得到一个rubyweaver.mxp文件。

提示 如果读者无法登录该站点,或者无法接入互联网,那么可以使用光盘中tools/路径下的rubyweaver.mxp文件。

(2)使用Macromedia的Extension Manager来安装Dreamweaver的Rubyweaver.mxp插件,启动Extension Manager管理器,将看到如图1.27所示的对话框。

注意 图1.27是已经成功安装Rubyweaver.mxp后的效果,如果读者还未成功安装该插件,将看不到成功安装Rubyweaver插件的项,也就是图1.27中第二个指示框指出的内容。

图1.27 使用Extends Manager安装rubyweaver.mxp插件

(3)单击如图1.27所示窗口左上角的“安装插件”按钮,将出现一个文件浏览对话框,在文件浏览对话框中选择刚刚下载得到的rubyweaver.mxp文件,然后单击文件浏览对话框中的“安装”按钮,就可以完成Rubyweaver.mxp插件的安装。

成功安装了Rubyweaver.mxp插件后,就可以使用Dreamweaver,以所见即所得方式来编辑RHTML页面了。

图1.28显示了使用Dreamweaver编辑RHTML页面的效果。

图1.28 使用Dreamweaver编辑RHTML页面

经过上面步骤,我们已经完整地搭建了Ruby on Rails的开发环境,后面的章节将开始Ruby on Rails开发之旅。

1.5 本章小结

本章主要介绍了Ruby on Rails框架的相关知识,以及如何搭建Ruby on Rails的开发环境。本章从企业级应用开发讲起,简要介绍了Java EE开发平台和.NET开发平台。介绍Java EE开发平台时,尽量与Ruby on Rails开发平台进行对比,既提取了二者的相似之处,也详细对比了二者的差别之处。通过这种对比,可以让熟悉Java EE开发的读者快速掌握Ruby on Rails开发平台的要点。本章最后详细介绍了如何搭建Ruby on Rails的开发环境,包括使用EditPlus和Eclipse来开发Ruby文件,也包括使用Dreamweaver来编辑RHTML页面。