第1章
简介
Introduction
Ruby on Rails是一个框架,一个使Web应用的开发、部署和维护变得更容易的框架。自从发布第一个版本以来,Rails已经从一个默默无闻的玩具蜕变成了一种世界性的现象。它拿下了一个又一个的奖项,更重要的是,很多web2.0应用都选择它作为基础框架。Rails已经不再只是一小撮黑客推崇的时髦玩艺:很多跨国公司正在用它来开发自己的web应用。
为什么会这样?有几个方面的原因。
首先,很多开发者已经对自己开发Web应用所使用的技术深感厌倦。不管使用Java、PHP还是NET,越来越多的开发者开始深切地感到:这些东西实在难用得要死。就在此时,Rails从天而降,而且它要简单得多。
光有简单是不够的。这些人都是专业的软件开发者,他们编写的是真实的网站应用,他们希望自己的产品经得起时间的检验,所以他们总是选择先进而专业的技术。这些开发者们深入研究了Rails,并发现它不仅仅是一个快速开发网站的工具。
譬如说,所有的Rails应用都采用了“模型-视图-控制器”(Model-View-Controller,MVC)架构。Java开发者都很熟悉MVC框架,例如Tapestry和struts。但Rails把MVC贯彻得更彻底:当你用Rails开发时,每一块代码该放在什么地方都有一定之规,代码之间都按照规定的方式进行交互。从一开始,Rails就已经帮你准备好了应用程序的骨架。
专业的程序员总是给自己的代码编写测试。同样,Rails也提供了这方面的支持。所有的Rails应用都天生内建了对测试的支持。当你开始增加功能时,Rails就会自动帮你创建针对这项新功能的测试存根(stub)。Rails框架让应用程序的测试变得更容易,因此,Rails应用也更能够得到充分的测试。
Rails应用是用Ruby编写的,这是一种现代的面向对象脚本语言。Ruby很简洁,却又不致简练得难以理解。使用Ruby,你可以自然而清晰地表述自己的想法,因此,Ruby程序很容易编写,而且放上几个月之后也很容易读懂——这是非常重要的。
Rails给Ruby加上了一些限制,又进行了一些独具匠心的扩展,使得在其中编程更加容易,也让我们的程序更短小、更易读,并且让我们能够在代码中完成一些通常需要用上外部配置文件才能完成的任务。这样一来,我们可以更轻松地看懂其中的逻辑。譬如说,下面的代码定义了一个项目中的模型类。现在你不必操心其中的细节,只要注意在这短短几行代码中描述了多少信息即可。
class Project<ActiveRecord::Base
belongs_to:portfolio
has_one:project_manager
has_many:milestones
has_many:deliverables,:through=>:milestones
validates_presence_of:name,:description
validates_acceptance_of:non_disclosure_agreement
validates_uniqueness_of:short_name
end
开发者们还会在Rails中发现另一件事:这个框架的背后有一套完整的哲学支撑。Rails的设计始终遵循两个核心原则:DRY和惯例重于配置(convention over configuration)。DRY也就是不要重复你自己(Don't Repeat Yourself)的缩写:系统中的每项知识只应该在一个地方描述。借助Ruby 的强大威力,Rails实现了这一目标。在Rails应用程序中,你几乎不会看到重复的代码,每件事情都只需要说一遍——
你只要在符合MVC架构惯例的某个地方说一遍,以后就不必再重复了。用惯其他web 框架的程序员大多有这样的经历:只要对数据库结构做一点点修改,就必须同时修改好几处代码。对他们而言,DRY的哲学不啻是一大福音。
惯例重于配置也同样重要。对于“如何将应用程序组装起来”这件事,Rails自有一套默认的规则——相当有道理的一套规则。只要遵循命名惯例,编写一个Rails应用程序所需的代码量比起典型的、使用XML配置的Java web应用要少得多。如果你不想遵循这些惯例,在Rails中也很简单。
开发者们还会在Rails中发现别的惊喜。Rails是一个新生框架,它的核心开发团队了解新的Web 业务模式。Rails不会亦步亦趋地紧跟新近出现的web标准:它本身就在web标准的制订中起着重要的作用。此外,Rails也让开发者们能够更轻松地将Ajax和RESTful接口之类的新技术整合到自己的应用中——它内建了对这些技术的支持(如果你还不熟悉Ajax和REST接口,别担心,我们会在本书中介绍它们)。
开发者们还需要考虑应用的部署问题。使用Rails,你只需要输入一条命令,就可以将应用程序的最新版本部署到任意多台服务器上(如果发现最新版本不好用,撤销部署也同样容易)。
Rails是从一个真实的商用程序中抽取而成的。要创造一个框架,最好的办法也许就是:首先出一类特定应用的核心场景,然后逐渐从中抽取出通用的代码基础。其结果是,当开发Rails应用程序时,你
会发现:在你开始动手编写任何一行代码之前,一个出的应用程序已经有一半在你手上了。
当然,Rails还有别的好处——有些甚至很难言传。总之,Rails就是让人感觉很爽。当然了,正所谓百闻不如一见,听我们说的再多,也不如让你自己动手写一点Rails的应用程序(这大概是下一个45分钟的任务……)。这也就是我们这本书的目标所在。
1.1Rails是敏捷的
Rails Is Agile
既然本书的名字叫作Agile Web Development with Rails,你可能会感到奇怪:为什么书里没有关于“在Rails中运用某某敏捷实践”这样的章节。
中文版php开发工具原因很简单:敏捷是Rails的基础所在。
我们来看看“敏捷宣言”1所描述的价值观,这段简短的文本描述出了敏捷开发者的选择。
�人和交互重于过程和工具。
1/。Dave Thomas是这份文本的17位作者之一
�可以工作的软件重于求全责备的文档。
�与客户合作重于合同谈判。
�随时应对变化重于循规蹈矩。
Rails非常强调人和交互。这里没有繁重的工具,没有复杂的配置,没有冗长的过程。这里只有开发者组成的小组、他们最爱的编辑器,以及Ruby代码。于是,开发的透明度更高:开发者所做的工作能够立即让客户看到。这是一个天生的交互式过程。
Rails并不打算废弃所有文档,而是使你可以毫不费劲地为所有代码生成HTML格式的文档。但Rails的开发过程并不由文档驱动。在一个Rails项目的核心地带,你不会到一份500页的规约说明书,只会看见一组用户和开发者共同发掘需求、寻实现需求的办法。你会发现,随着开发者和用户对试图解决的问题越来越了解,解决方案也会不断变化。你会发现,这个团队在开发循环的初期就开始交付可以工作的软件。这个软件的细节可能很粗糙,但它让用户可以亲身体验你所交付的东西。
因此,Rails也鼓励着用户与开发团队合作。一旦看到Rails项目能够以如此之快的速度响应变化,客户就会开始相信开发团队能够交付自己真正需要的东西,而不仅仅是自己所要求的东西。客户与开发团队之间的对抗将被建设性的讨论取代。
说到底,这些都要归结到“响应变化”。Rails强烈要求——甚至可以说是强迫——遵循DRY原则,这就意味着一旦变化来临,Rails应用需要修改的代码量比用其他框架开发的应用要少得多。而且,由于Rails应用是用Ruby编写的,而Ruby又能够准确、简练地描述程序概念,因此,变化也更加容易被限制在一个小模块内部,并且代码修改也更容易。对单元测试和功能测试的强烈重视,以及对测试套件和mock 对象的支持,又给了开发者一张可靠的安全网,这是进行修改时不可或缺的。有了一组完善的测试作为保障,开发者们将更有勇气面对变化。
所以,我们觉得,与其想方设法地把Rails应用的开发过程跟敏捷原则扯上关系,还不如让Rails 框架自己来讲述这些原则。当阅读本书的“实例教学”部分内容时,请想象你自己正在用这种方式开发web 应用:跟客户坐在一起工作,共同决定每个问题的优先级,然后共同为每个问题到解决办法。然后,当读到后面的“深入参考”部分内容时,再考虑Rails的结构能够怎样帮助你更快地满足用户需求。
最后一点关于敏捷和Rails的提示:虽然这听起来有点不太专业,不过,请留意在Rails中编写代码有多么愉快。
1.2读你所需
Finding Your Way Around
本书的前两部分将介绍Rails背后的概念,并提供一个不算太小的范例——我们将一起构造一个简单的在线商店系统。如果你希望亲身体验一下Rails编程的感觉,这是一个不错的起点。实际上,大多数读者似乎乐于一边读书一边亲手构造这个示例应用。如果你懒得敲键盘,也可以直接下载源代码(提供压缩的tar文件包和zip压缩包两种格式)。2
本书的第3部分则会详细介绍Rails的诸多功能。如果你想弄清一个组件怎么用、如何高效而安全地部署Rails应用,就请阅读这一部分。
2下载地址:www.pragprog/titles/rails3/code.html。
在阅读的过程中,你会看到下列约定形式:
真实代码
本书中展示的代码片段大多来自真实运行的示例应用,你可以下载完整的应用程序。为了帮助读者理解,如果一段代码能够在下载的应用中到,在代码的上边就会有一个路径指明它所在的文件,就像这样:Download work/demo1/app/controllers/say_controller.rb
class SayController<ApplicationController
→def hello
→end
end
这就是源代码文件在下载文件包中的路径。如果你阅读的是本书的PDF版本,而且你的PDF阅读器又支持超链接的话,你可以直接点击页面上的标记,代码就应该会出现在浏览器窗口中。某些浏览器(例如Safari)会错误地将b模板解释为HTML页面,如果发生这种情况,只须浏览页面的源代码即可看到真正的源码。
有时候并不能马上发现修改了现有文件的那些行,代码左边的小箭头可以帮你清楚的到。前面代码中的两行就有这样的指示。
Ruby贴士
没错,你需要懂Ruby才能写Rails应用程序。不过我们明白,很多人在读本书的时候其实已同时在学习Ruby和Rails了。本书的附录A对Ruby语言做了一个非常简单的介绍。当书中第一次用到某种Ruby特有的语言构造时,我们会为它做一个指向该附录相关内容的交叉引用。譬如说,这段内容如果用到了:name这个Ruby符号,在页边上就会有一个指示“符号”这种语言构造,在第635页处有解释。
另外,如果你不懂Ruby,或者想要快速刷新一下自己的记忆,你可以首先翻到第633页,阅读附录A。
书中有很多Ruby代码,要是对Ruby一窍不通的话……
David说……
你会不时地看到“David说……”这样的边框,其中的内容是David Heinemeier Hansson想要与你分享的、关于Rails的独特见解——原理、技巧、推荐,凡此种种。David是Rails的创始人之一,所以,如果你想成为Rails专家的话,这些内容是不容错过的。
Joe问……
Joe是一个虚构的开发者形象,他常常会针对我们在书中讲解的内容提些问题,而我们则会试着回答这些问题。
这不是一本Rails参考手册,我们将展示大部分模块和方法,可能是通过示例,也可能是通过文字介绍,但我们不会列出上百页的API列表。这么做的原因是,只要你装上Rails,就已经得到了完整的API 文档,而且肯定比本书的内容更新。如果你通过RubyGems安装了Rails(这也是我们推荐的安装方式),只要启动Gem文档服务器(使用gem_server命令),再用浏览器访问localhost:8808,你就可以访问所有的Rails API文档。
Rails的版本
Rails Versions
本书所介绍的是Rails  2.0版。特别需要注意的是书中的代码是针对于Rails2.2.2RubyGem编写的。Rails以前版本中的内容与现有的不兼容,很可能以后的版本也是如此。
1.3致谢
Acknowledgments
也许你会认为,写一个再版的书应该是很容易的事情——毕竟已经有写好的东西在那儿了,无非是再对代码和文字做些小修小改罢了。这能有多费劲呢?
这点很难讲清楚……不过我们感觉这本Aglie Web Development with Rails每一版所耗费的精力丝毫不亚于第l版。Rails一直在发展,所以这本书也一直跟着它发展。就拿Depot应用来说吧,整个应用都作了调整,有些部分更是被重写了好几次。Rails强调REST、并且增加了废弃(deprecation)机制,这都对本书的结构造成了影响——曾经热门的东西不再热门了,又出现了新的热门。
所以,如果没有Ruby和Rails社区的大力帮助,本书根本就不会存在。一开始,本书是以“beta 图书”的方式发行的:我们以PDF文件的形式发布了较早的版本,读者们很快地通过网络提出反馈——他们给了我们超过1200条建议和错误报告。众人的智慧融合一处,给这本书提升了巨大的价值。所以,谢谢
大家,感谢你们对“beta图书”的支持,更感谢你们贡献了那么多宝贵的反馈意见。
和撰写第1版时的情况一样,Rails核心团队给了我们巨大的帮助:回答我们的问题,检查我们的代码,修复其中的代码。感谢你们:
Scott Barron(htonl),Jamis Buck(minam),Thomas Fuchs(madrobby),Jeremy Kemper(bitsweat),Michael Koziarski(nzkoz),Marcel Molina Jr,(noradio),Rick Olson(technoweenie),Nicholas Seckar(Ulysses),Sam Stephenson(sam),Tobias Lutke(xal)以及Florian Weber(csshsh)。
我们还要感谢那些对本书中具体章节作出贡献的人:Leon Breedt,Mike Clark,James Duncan Davidson,Justin Gehfland以及Andreas Schwarz。
Sam Ruby要说
努力的结果是超乎想象的困难和回报。困难在于Rails改变的太多了,很多东西都要学习(一方是Rails2.0和SQLite3,另一方面是不同的出版商、操作系统以及工具集)。但我还是无法表达出我对Beta 版图书方式的喜爱,这本书的读者太棒了,他们的建议,问题和反馈都会得到足够的重视。
Sam Ruby
June2008
rubys@intertwingly
Dave Thomas要说
每次写书时我都暗下决心:再也不写下一本书了,因为那就意味着我又得跟家人分别好几个月。所以,再一次地感谢你们:Juliet,Zachary和Henry——感谢你们所做的一切。
Dave Thomas
2006年11月
dave@pragprog com

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。