每一个热爱技术的人似乎都赞同这样的观点:Ruby on Rails以一种神奇的方式创建Web(或Web 2.0)应用程序。Ruby是一种强大而灵活的编程语言,Rails利用这种灵活性建造了一个Web应用程序框架,它为开发者完成了很多工作。一切看起来都很棒。
此外,所有关于Ruby on Rails的书大多会介绍“模型一视图一控制器”,这些书深入应用程序和数据库。从一个经验丰富的Rails开发者角度来说,这很容易理解——框架的强大更多地依赖于如何使开发者方便迅速地创建数据模型,并在此之上构造控制器逻辑,接着,在完成所有复杂的工作之后,在最顶层加上界面视图。这是一种非常好的编程方式,有助于建造更强大的应用程序,而且还可以添加很多高级的AJAX功能。
然而,对于许多学习Ruby on Rails的人来说,如何自如地运用Rails的强大特性是一件异常痛苦的事情。Rails有很多看似神奇的行为,但是单看一条语句又觉得不太正确,而且为了弄清发生了什么,意味着要将Rails做的所有事情分解开。Rails使数据库和对象的操作变得更简便,让开发者不用总想着它们,但是在实现这些简便之前,还有很多东西需要弄明白。
如果你愿意慢慢地学习Ruby on Rails,从一般网页开发者所熟悉的小程序开始,慢慢进入控制器和模型的世界,那么本书将会非常适合你。你可以从已经了解的HTML开始,逐渐深入到Rails众多互相关联的内部组件中。
适合读本书的人
具有Web开发经验的人会知道编写Web应用程序总比想象的要复杂。它需要涉及很多方面,同时还要管理很多人,要让很多浏览者满意。但Ruby on Rails会帮助你出谋划策。你可能是一位设计师,正转向应用程序开发或者想成为一名兼具设计能力的开发者。你也可能是一位程序员,熟悉HTML但缺乏优秀设计所需的美感——本书的其中一位作者正是如此。无论你来自哪里,从事什么工作,只要你足够了解Web,想知道Rails如何使你的工作更加方便,本书都适合你。
阅读本书之前唯一必须要掌握的技术就是HTML,并且需要大体上知道如何编程。作为第一步,你需要将Ruby代码插入HTML中,然后才是直接编写Ruby代码,所以理解HTML是非常关键的。(如果你完全不了解Ruby,可以看看附录A,或者至少遇到问题时,把它作为一个参考手册。)
层叠样式表(Cascading Style Sheets,CSS)会使HTML更好看,但它并不是阅读本书所必需的。同样地,了解JavaScript如何运作也是很有帮助的。具有使用其他编程语言(如PHP、ASP以及ASP.NET)的经验也会有帮助,但也不是必需的。
还需要你习惯对命令行的使用。虽然这些命令并非特别复杂,但至少到目前为止,它们还没有完全包含于图形界面下。即使是Rails的在线集成开发环境(IDE)——Heroku,仍然拥有一些必要的命令行特性。
不适合读本书的人
我们并不是真想将任何人拒绝在这本书之外,但确实会有不少人不适合这本书。前面几章中对“模型一视图一控制器”的介绍可能会使他们直皱眉;那些坚持数据结构是一个出色应用程序的核心的人,需要等相当长的时间才会看到他们希望看到的。如果你认为HTML只是一个程序员不得不忍受的讨厌东西,那么本书也不适合你。其他关于Ruby on Rails的书大部分也是为那些想要从模型开始的人而著的。
同样,那些相信Ruby和Rails是唯一真理的人也不会喜欢读这本书,书中花费了大量的时间来敬告读者他们需要避免的潜在问题和困惑之处。的确,一旦你使用Ruby和Rails工作了一段时间,它们的精妙之处自然会显现。但是达到熟练驾驭Ruby和Rails这一水平的过程却很辛苦,本书试图通过清晰的描述尽可能多地帮你战胜这些挑战。
你会学到什么
创建Ruby on Rails应用程序需要掌握一系列复杂的技巧。但你其实只需知道其中的一部,分,这点要取决于你如何使用Ruby on Rails,以及和什么人一起工作。好了,只要尽可能地学习你需要的内容就好。
首先,你需要安装Ruby on Rails。我们介绍了很多不同的安装方法,重点是从中找出使Ruby和Rails运行的简便方法。
下一步,我们会创建一个很简单的Ruby on Rails应用程序,只有一个基本的视图,然后是一个只做几件事情的控制器。在此基础上,我们将阐述如何利用各种工具创建更复杂的布局,并在这个过程中更多地了解Ruby。
当我们学会了如何显示信息,就可以深入地学习一下控制器以及它能做什么。表单的处理对于大多数网页应用程序都很关键,因此我们要建立几张表单,从简单的到复杂的,并对它们的结果进行处理。
虽然表单不用存储数据就可以做很多有趣的事情,但是能把数据存储起来(而不是一会儿)会变得更有趣。下一步就要建立一个存储信息的数据库,然后告诉你Rails的ActiveRecord是如何轻松地创建能直接映射数据库结构的神奇代码,而无需过多地考虑数据库结构或SQL。
一旦我们使ActiveRecord运行起来,就可以探讨脚手架和它的各种可能性了。Rails的脚手架不仅帮助你快速创建应用程序,而且会教你如何做得更好。Rails 2.0中强调的RESTful让创建出既吸引人又易于维护的应用程序变得很轻松,为了证明这点,我们使用脚手架同样做了一次使任务变得简单的演示,我们希望这样能够帮助你更加易于理解所发生的事情。
理论上,这时即使应对稍复杂一点的数据模型,对你来讲也不是难事了。接下来,我们再看那些需要结合多表数据的应用程序。混用及匹配数据是大多数Web应用程序的核心。
. 然后,我们会介绍Rails代码的测试与调试,这点是框架成功的关键因素。迁移是Rails实现应用程序可维护性的另一个关键部分,它可以让你很容易地修改底层数据结构(如果必要的话,甚至能撤销这些修改)。
接着是增加一些常见的Web应用程序元素,比如会话(session)和cookie,以及认证。Rails(有时在插件的帮助下)可以为你完成很多这方面的工作。
我们还会让Rails完成更多的功能,创建令人心跳的Ajax应用程序以及发送邮件。最后,将为你展示使Rails应用程序公布于众的方法——用MySQL和Phusion Passenger进行部署,并且介绍一些其他的方式。
读完本书,你会非常享受在Rails中进行编程。你可能还不是一位Rails大师,但你会利用现有的一切资源,力争成为一名大师。
Ruby和Rails的风格
你绝对可以用和其他语言相似的方式来编写Ruby on Rails的代码。但是那样的代码通常都不是真正意义上的Ruby,因为使用Ruby的程序员已经开辟了新的风格。总地来说,本书自始至终都在尝试使用其他环境中为开发者所熟悉的语法来引入新的概念,然后再解释Ruby的习惯是什么样子的。如果你愿意,可以通过学习上面的方式编写地道的Ruby,同时还耍弄懂如何像Ruby高手一样阅读代码。
我们设法确保Ruby知识背景不深的人也能够理解书中呈现的代码。虽然Ruby本身是值得用一本或几本书来详细介绍,但许多Rails应用程序中的Ruby都很简单,这点要归功于框架创建者的辛勤劳动。如果你希望在深入学习前,学习一些关于Ruby的基础知识,可以在第1章之后,读一读附录A。
其他的选择
学习Rails还有很多不同的方式。有人希望详细学习Ruby之后,再学习如何使用它的框架。这是一种很不错的选择,如果你也打算这么做,应当看看下面几本书:
《Learning Ruby》(O'Reilly, 2007)
《The Ruby Programming Language》(O'Reilly, 2008)
《Ruby Pocket Reference》(O'Reilly, 2007)
《Programming Ruby》, 第三版(Pragmatic Programmers, 2008)
或许你还需要其他关于Rails的书作为本书的补充(或替代本书)。如果你需要其他一些,资源,可以阅读:
《Head First Rails》(O'Reilly,2008),通过练习提供了更直观的学习方式
《Up and Running with Rails》,第二版(O'Reilly,2008),介绍了快速入门方式
《Simply Rails 2》(Site Point,2008),介绍的内容与Learning Rails相似,但使用的是不同的观点和实例资料
http://www.learningrails.com提供免费的Rails入门级播客(podcast)和screencasts
《The Rails Way》(Addison-Wesley,2007),为那些已经了解Rails的开发者准备的一本好书
《Rails Pocket Reference》(O'Reilly,2008),作为参考小手册
《Agile Web Development with Rails》,第三版(Pragmatic Programmers,2008),Rails各种功能的详细介绍
《Enterprise Rails》(O'Reilly,2008),介绍创建大规模的应用程序
《Advanced Rails》(O'Reilly,2008),为你进入更高级别作准备
你需要确保任何所使用的书籍或在线文档都覆盖了Rails 2.0或更新的版本。Rails在不断地发展,导致许多曾经很棒的书现在已经不幸地过时了,这些书很危险。(有的书还可以用,而有的书则不能用了。)
Rails的版本
Rails团队正不断地改进Rails并发布新的版本。本书使用的是Rails 2.0和2.1,而且所有的实例都经2.1测试过。不久后Rails 2.2就要问世了,它似乎没有多少重大的改变,除了文中提到的一些。我们将在http://www.excursionsonrails.com发布新版本更新的内容。
如果你在运行实例的时候遇到困难
当你开始使用一个新框架时,可能很难(甚至不可能)辨认出错误信息。在这本书中,我们时而会标注出一些你可能会遇到的错误,但似乎通常不同的人在运行实例时会遇到不同的错误。它们有时是由漏掉一步或输入的代码和书中不同而导致的。即使这个错误信息像来自框架深处,但它并不是Rails自身的缺陷所导致的。它很可能不是框架的错误,而是框架在弄清楚如何处理异常代码时出现的问题。
如果你遇到了阻碍,应当对以下几个方面进行检查:
你运行的是哪个版本的Ruby?
你可以输入ruby -v来检查。本书所有的实例都是用Ruby 1.8.6编写的。旧版本可能会导致Rails报错,同时1.9版本添加了一些功能,同样会造成某些新问题。虽然第1章探讨了如何安装Ruby,但是你可能还需要某些特定针对你的操作系统和环境的说明文档。
你运行的是哪个版本的Rails?
你可以输Arails-v来检查。尽管你可以用任何版本的Rails 2.x运行书中的实例,但是这些实例(包括你可以在本书的网站上下载到的)都是用Rails 2.1.0创建的。如果你运行其他版本的Rails,尤其是旧版本,那么就可能会遇到问题。(尽管书中的某些实例可以在Rails 2.0之前的版本上运行,但是其中的大部分很快就会遇到问题。)
你是否用了正确调用程序的方式?
Linux和Mac OS X都使用斜杠“/”作为目录分隔符,而Windows用的是反斜杠“\”。本书用的是斜杠,但如果你用的是Windows,那么就需要使用反斜杠。
是否连接了数据库?
默认情况下,Rails认为你使用的是SQLite数据库,然而有些人安装的是MySQL或其他数据库。如果你遇到的错误中某些地方显示了“sql”字样,很可能是数据库的问题。对于那些简单的无需调用数据库的应用程序,见第1章最后的指令,这些指令告诉Rails不要去寻找数据库。对于那些需要数据库的复杂应用程序,先检查数据库是否安装并运行,然后检查database.yml中的设置是否正确,如果有许可的话,还要检查许可是否设置正确。
所有的组件都备齐了吗?
大多数情况下,组建一个Rails应用程序,即使是简单的,也需要修改很多文件——至少要修改视图和控制器。如果你只搭建了控制器,那么你丢掉了用来查看结果的很关键的部分;如果你只搭建了视图,则需要控制器来调用它。当你搭建的应用程序越来越复杂时,就需要考虑路由、模型,甚至是配置和插件。应用程序中某部分的一个看似简单的调用可能要依赖别处的其他组件。
尽管最后你会知道什么类型的问题是由缺少组件造成的,但至少开始的时候,你要在运行实例之前,确保输入了全部的内容。
也可能有的文件被设置了错误的许可。如果你知道一个文件在哪里,但是Rails似乎无法得到它,就要检查一下许可是否设置正确。
命名都正确吗?
Rails依靠命名惯例在数据和代码之间建立连接,而不用你做出任何明确的指示。这在一般情况下运行得都很好,除非是在某处你出现了模糊不清的错字。Rails同样还依赖于许多关于Ruby变量的惯例,好比以@开头的实例变量或以:开头的符号。这些特殊的字符有很大的差别,所以一定要确保它们都正确。
Ruby的浯珐是否正确?
如果出现了语法错误,有时甚至是nil对象的错误,你可能多加了一个空格、漏掉了一个括号或犯了类似的错误。Ruby的语法是极其灵活的,所以通常你都可以忽略各种括号或空格,但是有时这些括号和空格在程序中却是很关键的。
作者是不是弄错了?
很显然,我们努力确保书中的所有代码在开始时都能运行顺畅,但错误还是可能会出现的。你需要核对勘误表,下一部分会具体介绍勘误表,以及下载样本代码,这些样本代码都会随勘误表更新。’
尝试通过Google搜索错误并快速寻找出解决方案,这是很吸引人的。不幸的是,刚刚描述的这些问题可能在文档里没有明确的记录。有时Rails API文档可能会有帮助,尤其是当你尝试扩展本书的某个实例,那就没有更多的选择了,你可以把它下载下来,并亲自来搞定。
如果你喜欢(或是不喜欢)这本书
如果你喜欢(或不喜欢)这本书,请一定要让别人知道。Amazon评论是一种很流行的方式来分享你的快乐(或不快),你也可以在本书的网站http;//www.oreilly.com/catalog/9780596518776/发表评论。
那里还有到勘误表的链接。读者可以通过勘误表让我们知道书中的错字、错误和其他问题。勘误表会立刻显示在页面上,我们将对它进行检查并确认。O'Reilly还会在将来印刷本书时以及Safari上更正勘误表,迅速为读者带来更好的阅读体验。
我们希望本书能随将来的Rajls版本而更新,而且我们会在以后的版本中采纳读者的建议和意见。
本书体例
本书中的字体用法如下:
斜体字(Italic)
表示路径名、文件名和程序名,互联网地址,如域名、URL等,以及用在为新事物下定义的时候。
等宽(Constant width)
表示命令行和选项,你需要一字不差地输入这些内容;还表示名字和程序中的关键字,包括方法名、变量名和类名,以及HTML的元素标签。
等宽加粗(Constant width bold)
表示程序代码行中要强调的内容。
等宽斜体(Constant width italjc)
所示文本应该由用户所提供的值来替换。
注意:包含了小贴士、建议或通常需要注意的地方。
警告:表示警告或需要小心的地方。
代码实例的使用
书中用到的代码实例,在http://oreilly.com/catalog/9780596518776/网站上都可以找到。代码实例分为两种形式。一种形式是以一组实例的形式出现,按章节组织,对每个实例都进行了编号和命名。相关内容的章节都引用了这些例子;另一种形式是以书中所呈现的顺序对里面的所有代码进行转录。这种形式在你只需要一行命令,而又不把它放在最终的实例里时很有用,或是在你浏览实例时,想要剪切并粘贴部分程序片段时,这种形式也很有帮助。我们希望这些代码有助于你的学习。
本书还能够帮助你完成工作。通常情况下,你可以在自己的程序和文档中使用书中的代码,而不用事先获得我们的许可,除非你复制了书中的大部分代码。例如,使用书中几块代码来编写程序不需要获得许可,但是出售和分发存有O'Reilly书中实例的光盘就必须要获得许可。引用本书的内容和实例代码来回答问题不需要获得许可,但是将本书大量的实例代码放在你的作品中则必须要获得许可。
如果你能为书中内容写上出处和来源,我们表示感谢,但是我们并不强求。出处来源一般包括标题、作者、出版商和ISBN号。例如:“Learning Rails by Simon St.Laurent and Edd Dumbill.Copyright 2009 Simon St.Laurent and Edd Dumbill,978-0-596-51877-6.”
如果你觉得对代码和实例的使用超出了正常的使用范围或上述的许可范围,请和我们联系(permissions@oreilly.com)。
如何联系我们
虽然我们用尽最大的能力对书中的内容进行测试、核实,但你还是可能发现有些内容已经改变了(或发现我们犯了错误)。如果你发现了任何错误,请告知我们,并附上你对以后版本的建议,来信请至:
美国:
O'Reilly Media,Inc.
1005 Gravenstein Highway North
Sebastopol,CA 95472
中国:
北京市西城区西直门南大街2号成铭大厦C座807室(100035)
奥莱利技术咨询(北京)有限公司
我们为本书开辟了一个网页,上面列出了勘误表、实例和其他额外的信息,网址如下:
http://oreilly.com/catalog/9780596518776/
我们还建了一个支持页面,包括screencast、安装帮助,以及更多的内容:
http://excursionsonrails.com/
想要对本书发表评论或提出技术相关的问题,请发邮件至:
bookquestions@oreilly.com
想要了解更多关于我们的书籍、会议、资源中心(ResourceCenter)以及O Reilly网络的相关信息,请访问我们的网站:
http://www.oreilly.com
http://www.oreilly.com.cn
致谢
感谢Mike Loukides,他想到了Rails可以使用一种全新而且完全不同的方法,并且在本书的创作过程中一直给予支持。技术审阅者GreZZ Poilack、Shelley Powers、Mike Fitzgerald、Eric Berry、David Schruth、Mike Hendrickson和MarkLevitt都对本书的改进提供了很多帮助。rubyonrails-talk团队也定期对本书的编写给予鼓励,同时还为本书制作屏录和播客,分别放在了http://railscasts.com和http://railsenvy.com上。Edd Dumbill感谢他亲爱的孩子们:Thomas、Katherine和Peter,他们曾在他的键盘上狠狠地敲打,以及感谢他的合著者Simon St.Laurent,感谢他在本书的写作过程中给予的耐心鼓励。
Simon St.Laurent要感谢Angelika St.Laurent在著书过程中给予的支持,即使有时会被晚餐打断。感谢SungivaSt上aurent,她总是大声地提出她的建议。Simon还要感谢Edd Dumbill在最初给予他鼓励,并让这本书变成现实。
我们要感谢Sarah Schneider,正是因为她本书才得以面世,同时也要感谢Appingo的Mark Jewett和Virginia Ogozalek所付出的努力。Jessamyn Read使书中的插图更具吸引力,Seth Maislin为本书英文版建立了索引。