You are on page 1of 5

第一章 搭建开发环境创建 RailsCoders 项目

实战 Rails 社交网站一书适用的读者群,是那些想要用 Ruby on Rails 搭建社交类网站和真实


世界社区的开发者。本书中我们开发出一个现实世界的社区网叫 RailsCoders,你可以访问网
址 http://railscoders.net 去体验它,这个网站就是用本书中相同的代码来构建的。

通过学习如何建站,你就可以轻松地使用同样的代码运作自己的在线社区网站,或者调整开发
代码适应你的网站需求。

在第一章中将讨论宏观上高层次的项目需求。接下来介绍 Ruby 和 Ruby on Rails 的背景知识,


讨论如何用到 Rails 的一些特性让开发 web 应用变得轻快简单。指导你如何安装 Ruby, Rails
还有 MySQL,创建项目所用到的数据库。最后教你怎样建立应用程序的骨架代码并保证 Rails 可
以正确连接到数据库。

如果你已经在你的电脑上安装过 Ruby and Rails, 并做过一些教程的练习,或者熟悉用 Rails


开发项目,那么你可能希望快点掠过本章中的安装部分,但是你要检查你所安装的软件版本是
否符合项目的要求,其过程与安装基本相同。

RailsCoders 项目

RailsCoders 网站目标同时针对使用 Rails 的新手和有经验的开发者。除了开设一个通用的


Rails 开发者社区外,网站还包括了本书相关的新闻和论坛。

该网站两个主要的功能就是博客和讨论区:blog 包含 Rails 的文章及有关本书的新闻,论坛可


以让用户互相帮助,讨论开发中遇到的问题。要建成社区而不单单收集论坛帖子,网站目标就
是允许用户建立个人基本资料,创建 blog 的帖子,上传照片,并允许集成其它在线社区的个人
档案,比如来自 Flickr 社区的。

从上面的目标,我们可以生成自上而下的网站特性需求列表:
• 一个允许用户创建用户帐户,添加个人信息的系统:要求用户用他们的用户名和密码来
登录。
• 一个简单的方式让你维护信息页面:这些页面可能大多数时间是静态的,可是当页面变
更时,你不想去进入 HTML 编辑。这样,需要的是一个简单的内容管理系统。
• 一个新闻博客:运用一个站点提供的编辑器来创建新闻的文章,发布。
• 一个讨论论坛系统:论坛的版主应当能创建若干的讨论区,在各个讨论区里用户能开新
的话题。每个话题可以有任何数量的帖子。
• 一个博客引擎:网站的用户可以建立属于他们自己的网络日志,谈他们的项目和 Rails
开发经验。还要允许用户在桌面客户端 blog 软件发布日志的录入,跟在网上一样的操作
体验。
• 一个用户的个人相片展示区: 用户可上传他们的照片到他们的个人基本资料中,还应该
支持对照片的缩略图显示。
• 一个电子邮件通知系统:新闻信件可以送达所有的本站用户,假如用户接受了从网站的
email 收信订制。
• 浏览器选择:网页应该能在所有桌面浏览器和手机上移动式浏览器上显示。
由于许多的用户在其它的在线社区已经拥有了帐户,此站点需要能够集成其它社区。本书里的
RailsCoders 项目给用户从 Flickr 里显示他们最新的照片,同样也提供 RSS 来同步用户 blog,
让其它的社区网访问用户在 RailsCoders 里的数据。

期盼着 RailsCoders 流行起来, 我们需要确保它的扩展性,即同时处理大流量用户访问。也要


兼顾稳定性和安全性。

Ruby and Ruby on Rails

我相信你急不可待要开始项目开发了(我更等不下去了),但是在我们开始前,值得花点时间
了解 Ruby 和 Ruby on Rails 是什么以及它们之间的关系。

Ruby on Rails 深刻地改变了众多开发队伍和个人的 web 开发方式,涌现出来的小规模团队能


够非常快速轻松地开发了稳定的,易扩展的,易维护的 web 应用程序。Rails 所带来结果就是
又快又干净无害,意味着应用开发可以敏捷化交互化并举,稳定性与可用性兼得。

领会语言和框架的动态二重奏从何而来,会有助于清楚认识它们,并理解那些是产生生产力的
重要因素,让你伴着喜乐与之工作。

Ruby 的历史简介

Ruby 和 Ruby on Rails 经常被一口气提及,很容易想到它们是一个统一的整体和相同个体。观


察 Rails 的代码也没太多的帮助来区分,哪里是 Ruby 的结束哪里又是 Ruby on Rails 的开始。

简洁地说 Ruby 是一个编程语言,其它编程语言还有 Perl, PHP 或是 Java,但是 Ruby 与其它编


程语言有很多区别之处。首先,Ruby 一开始就被设计成面向对象的语言,不同于 Perl or PHP
后来有了面向对象的思想才后加上面向对象的特色。也不象是 Java or C#,Ruby 具有完全的对
象导向,即在 Ruby 中任何东西都是对象-没有原始类型。

Ruby 作为动态的语言,也意味着 Ruby 写的程序可以在运行时改变程序的自身结构。Ruby 是动


态类型的:变量不受限制成特定类型(比如整数型或字符型),在程序执行过程中变量可以改
变它们的类型。如果你有过其它动态语言的开发经验,比如 Perl 或 Python,可能不会有不寻
常的地方,但是如果你来自 C++ or Java 的背景,就会感到有一些与众不同的感觉。

松本行弘"Matz"(Matsumoto Yukihiro)是 Ruby 语言的发明人,于 1995 年发布第一个公开的版


本。Ruby 在日本很快得到了大量的用户支持,不久本土的使用数量超过了 Python。但是相对于
西方世界还是知者寥寥。在 2000 年,Ruby 独特的设计理念和效率吸引了一些程序员的目光,
直到 2004 年 Ruby on Rails 第一次发布才获得众人的关注(详情见下部分)。

开发背后的哲学可能是你从众多语言中选用 Ruby 的原因。Matz 设计的 Ruby 的原始目的是让程


序员能享受编程的快乐。它减少了大量琐碎的工作,从而令编程者集中精力去解决问题的创新
部分。该语言所有的设计理念的背后都是基于这个目标。
Ruby 已经赢得了广泛的声誉和直觉感官的知名度,其中最重要的还是,快乐有趣。广大的开发
人员从编写 Ruby 代码找到乐趣,你也可以依靠该语言的设计快速用代码表达你的想法。

注释 Ruby 官方网站 http://ruby-lang.org 是一个重要的学习场所,可以获取更多的信息。


还有一个在线文档的帮助 http://ruby-doc.org。

RUBY 的其它用途

Ruby 不仅是用来开发 web 应用,还可以用作系统管理和工具开发。标准库和不断增长的第三方


库给你提供快速开发的脚本,工具和应用。在 Ruby 开发上你化越多的时间,你就越喜欢用它来
开发各样工具和应用。也有 Ruby 的框架用作开发桌面应用。

对于苹果 Mac OS X 系统, 叫 RubyCocoa 的 Ruby 框架,可以使用 AppleCocoa 框架和 Ruby 写桌


面应用程序。详细的内容参考 http://rubycocoa.sourceforge.net

WxRuby 是 Windows 平台的应用程序开发框架, Linux 或 OS X 也可以使用 WxWidget GUI


library。访问 http://wxruby.rubyforge.org 获得更多信息。

甚至还有游戏开发的框架,Shattered Ruby,用来 3-D 游戏开发。详情见


http://shatteredruby.com 。

什么是 Ruby on Rails?

简单地说,Ruby on Rails 是由 Ruby 写的一系列的库和工具,用以快速开发 web 应用程序。工


具包称为框架。

这个框架最初不是作为一个独立的产品来构思设计的,它一个实际应用中的一部分并被抽取出
来。这样也成为 Rails 非常实用的原因之一。David Heinemeier Hansson(DHH), 在为
37signals(37 信号公司)研发基于 web 使用的项目管理工具 Basecamp(意思是大本营)时,
形成了 Ruby on Rails 设计思路。37signals 公司 http://37signals.com,试用 Basecamp
http://basecamphq.com 。

DHH 在用 PHP 和 Java 时感到不爽,改用 Ruby 觉得顺手得意。他就说服了 37signals 创始人


Jason Fried 给他个机会,让他用 Ruby 来开发程序,并用了三个月完成 Basecamp 的第一个版本,
从此 Ruby on Rails 诞生。Basecamp 发布之后,DHH 从应用程序中抽取了框架并作了开源公
布。

Rails 继承了 Ruby 设计哲学,集中精力让编程变得轻松快乐。Rail 的几个主要设计原则就是要


达成这样的目标:不要重复做自己做过的 don't repeat yourself (DRY)和惯例(或约定)优
于配置 convention over configuration。

DRY 不必过多解释。假如你已经定义过东西,应该不必再定义。例如,你一旦定义了数据库的
栏目名称,就应该不用在代码里其它位置重复定义了。因此减少大量的工作并避免代码中出现
不一致的情况。

DHH 和 37 信号公司的开源决策主要是因为他们相信开放的框架让更多的人来使用,也同时会得
到更多人的贡献,有助于框架自身快速的发展和改进。

注释 当你安装 Rails 时,实际上在安装 Ruby 的代码到 Rails。就在你的硬盘上,你可以去检验


到,关联到,从中学到甚至可以添加和改进这些代码。不必害怕到代码中看看,从中一定获益
良多。浏览代码,检查 bug 追踪情况,在线访问 http://dev.rubyonrails.org

简单地来说,Rails 就是 Ruby 包的组合,其中最重要的有 ActiveRecord 和 ActionPack。它们


得到其它的功能组件支持,比如 ActionMailer, ActionWebService 还有 ActiveSupport。

模型、视图和控制器 Models, Views, and Controllers

Ruby on Rails 框架采用了模型-视图-控制器(MVC)的架构。MVC 是一套设计模式,把数据模


型、用户界面和控制应用的逻辑分开。代码被隔离到三个层面, 你在一个层面工作就不会影响
到其它层面的代码,如下所述:
• 模型是应用专门用来操作你的数据的代码。任何操作你的原始数据的动作都经过这个
层。如果有改变或添加到存储的数据,应在这部分的代码中完成。
• 视图是展示层, 你的页面布局和表格在这层。它控制如何把你应用程序的结果展现给用
户。
• 控制器包含了应用程序的控制逻辑,这部分代码控制程序的流程,当用户执行了一个控
制器里动作,将会发生什么。

使用 MVC 架构的优势是带来了干净的代码并隔离开逻辑的部分,使得开发更容易,代码易读
懂,维护和控制也变得简便起来了。

提示 如果打算进一步学习设计模式,可以在维基百科中获得概况介绍
http://en.wikipedia.org/wiki/Design_pattern_(computer_science) 或阅读 Design
Patterns 方面的书 Elements of Reusable Object Oriented Software 作者 Erich Gamma,
Richard Helm, Ralph Johnson, and John Vlissides (Addison Wesley, 1995).

因为 Rails 促使你在架构上做出决策,你能化更多的时间集中处理应用,更少的时间担心系统
的信息流程了。

如何写出代码适应到这个架构,当你请求一个页面时发生了什么,这些都会在下面的章节中得
到准确的解释,一路伴随着我们开发的脚步。

模型: ActiveRecord

ActiveRecord(有人曾翻译成“活动记录”)是对象/关系映射 Object/Relationship Mapping


(ORM)的库。一个 ORM 库把数据库中存储的数据映射到应用程序的一个类。在存取数据时就不必
为 SQL 的查询语句来操心,甚至可以说成是如何访问数据。在数据库表的行会变成对象的实
例。尽管听起来有点复杂,实际上,这使得对数据库的操作异乎寻常地简单容易。Rails 的应
用里,所有与数据库的交互都通过 ActiveRecord 完成,因此学习掌握越多的 ActiveRecord 知
识和技能尤为重要。本书中给你几种不同的渠道,来使用它以及如何发挥出其最大功效。

视图和控制器: ActionPack

ActionPack 简而言之就是一帮助你建网站的库和工具集合。这些包提供 MVC 层次中的“视


图”和“控制器”。

ActionPack 中的视图部分用来产生 web 页面。事实上我们的网站所有的页面都是动态生成的


(不是静态的 HTML 文件), ActionPack 提供了一大堆的辅助功能来让我们把动态数据插入到一
个页面。控制器是 ActionPack 提供的另一个部分连接你的应用并绑到一起。控制器包括了代码
响应用户来自 web 浏览器的请求。

元编程 Metaprogramming

有时候分开 Ruby 和 Ruby on Rails 的难度之一就是 Rails 采用了一个所谓的 metaprogramming


技术,著名的领域专用语言 domain-specific language (DSL). DSL 作为一个编程的语言,设
计的目的是为了解决特定领域内的问题。本书的例子里,web 应用即是专门的领域范畴, Rails
是辅助在这个领域中你描述你的问题。

此 ORM ActiveRecord (在上文中“模型: ActiveRecord”提过) 为 DSL 提供存取你的数据,也


就是说我们可以用命令行的方式,find_user_by_username('alan') 里替代通过一连串的代码
来连接数据库,非得用 SQL 语句加工结果。一旦你开始用上 ActiveRecord 的 finder 方法来找
数据,你就很难回头再用 SQL 手工的方法去写应用程序啦。

Ruby 创建 DSLs 简便。你的 Ruby 技能渐长,你就应该思考如何用最佳的 DSL 概念开发你的程


序。这会带你扩展 Rails 的特性与你的应用领域做到更加好的搭配。

内建的测试功能

开发 web 应用测试经常被迫放到项目的结尾阶段,或是没有足够的时间,或是没有足够的重
视。通常这个原因是开发中的测试也许很困难很花时间。

Rails 框架完全集成自动化的测试工具。这些工具让测试变得难以置信般的简单,不论是写单
元测试,还是功能测试和集成测试。因为写个测试没那么难,你就会找到在开发代码的同时写
测试的感觉。

You might also like