01 前言
Ruby on Rails 是一种让开发,部署和维护网站应用轻松的框架。在初始版本发布后的几个月间,Rails 从一个无名之辈到形成影响世界级的现象。更加重要的是,它成为了进行 Web 2.0 应用开发时的框架选择。
为何如此?
Rails 就是感觉很好
大量的开发者都对他们用于创建网站应用的技术感到失败。无论他们是使用 Java,PHP,还是 .NET,他们都感到自己的工作越来越难。接着 Rails 就到来了,并且 Rails 也让事情变得更加简单。
但简单本身并不能解决问题。我们与真正编写网站的专业开发者进行了谈论。他们希望自己开发的应用能够经得起时间的考验,并且是通过现代,专业的技术设计和开发的。经过这些开发者对 Rails 的探索才发现它并不止是用于黑客攻击网站的工具。
例如,所有的 Rails 应用都是通过 Model-View-Controller(MVC) 架构实现的。Java 开发者通常也使用 Tapestry 和 Struts 这些基于 MVC 的框架。不过 Rails 对 MVC 的应用更进一步,当你通过 Rails 进行开发时,你会开始于一个正在运行的应用,每段代码都有相应的归属地,应用中的每段代码也都有标准的互动方式。
专业的程序员都会编写测试。同样,Rails 也提供了类似服务。所有的 Rails 应用都有测试支持。如同你向代码添加的基本功能一样,Rails 为函数自动创建测试打桩。框架使应用的测试更加方便,而且作为结果 Rails 应用也更加趋向于采用测试。
Rails 应用通过 Ruby 编写,Ruby 是一门现代的,面向对象的脚本语言。Ruby 非常的简明又不晦涩,你可以通过 Ruby 代码自然清晰地表达自己的想法。这个特点会导致程序在几个月后依然可以轻易读写,这也是很重要的。
Rails 将 Ruby 发挥至了极限,并通过新奇的方式扩展了 Ruby 为了使程序员的生活更加轻松。这也使我们的程序简洁且可读性更高。Rails 也允许我们将外部配置文件的内容通过内部的代码方式替换。这样更容易了解代码逻辑中发生的事情。下面的代码为项目定义了模型类。现在不要为内容中的细节担心。反而你应该思考一下这区区几行代码中有多少信息被表达了出来。
class Project < ActiveRecord::Base
belongs_to :portfolio
has_one :project_manager
has_many :milestones
has_many :deliverables, through: milestones
validates :name, :description, presence: true
validates :non_disclosure_agreement, acceptance: true
validates :short_name, uniqueness: true
end
还有两个哲学基础保持了 Rails 代码简洁及可读性高,分别是 DRY 和约定大于配置。DRY 全称是别重复自身。系统中的每段知识都应该只在一个地方表达。Rails 通过 Ruby 的力量将这一切带入了日常。你只会在 Rails 中发现少量的重复,你只在一个地方表达你想表达的内容(这个地方通常是 MVC 架构约定的地方)然后继续。对于其他程序员使用的网站框架,当需要对模式有修改时就可能需要对其中包含的大量代码进行修改,这是出乎意料的。
约定大于配置也很重要。这意味着 Rails 对织入应用中的每个方面都进行了合理的默认配置。跟着约定,你可以用比典型的 Java 网站应用通过 XML 配置更少的代码编写 Rails 应用。如果你需要重写约定 Rails 也可以简单地完成。
来自 Rails 的开发者还发现了一些事情。Rails 不仅仅在追赶当前的 web 标准,它也帮助了这些标准的定义。由于对 web 标准的支持已经在 Rails 中构建,对于开发者集成 Ajax 和 RESTful 接口等特性就会简单很多。(如果你对 Ajax 和 REST 接口不熟悉的话也不要担心,我们稍后会在书中进一步解释)。
开发人员以部署的问题也很关心。他们发现通过 Rails 你可以使用一个命令将持续发布的应用部署至多个服务器上(如果发行版本被证明不够完美也可以轻松地回滚)。
Rails 确实是来自真实世界的商业应用。Rails 展现了创建框架的最好方式就是在特异的应用中发现核心主题并通过代码的泛化方式突破它。当你正在开发你的 Rails 应用时,你已经有拥有一个优良应用的半成品了。
不过 Rails 中也有一些难以描述的地方。无论怎样,你就是觉得它好。当然,你要体会我们的意思需要你亲自开发一些 Rails 应用(在接下来的 45 分钟或者以后)。这就是这本书的全部了。
Rails 是敏捷的
这本书的名字是 Agile Web Development with Rails 4,你可能会惊奇地发现我们并没有明确的章节讲述在 Rails 编程上的敏捷练习。
这样做的原因也是简单面微妙的。因为敏捷本身就是 Rails 的构成部分。
让我们看一下敏捷宣言表达的价值观。
- 个体与交互高于流程与工作
- 可工作的软件高于面面俱到的文档
- 客户合作高于合同谈判
- 响应变化高于遵循计划
Rails 完全遵循个体与交互。Rails 并没有重量级的工具,没有复杂的配置和流程。只要少部分的开发者喜欢编辑器和大段的 Ruby 代码。这提高了透明度,开发者所做的事情会立即反应给客户看见。它本质上就是一个交互过程。
Rails 并不谴责文档。Rails 可以轻易地以你代码为基础创建 HTML 文档。但 Rails 的开发流程并不是由文档驱动的。你不会在 Rails 项目的核心部分发现 500 页的说明书。反而,你会发现用户和开发者共同探索他们的需求以及满足这些需求的可行方式。你最终会发现开发人员和用户在关于如何解决问题上都变得更加经验丰富。你会发现一个在开发周期早期便进行软件交付的框架。这个软件可能有一些模糊的边界,但它让用户可以看见你将交付的产品。
通过这种方式,Rails 鼓励客户合作。当客户看见 Rails 项目可以快速应对变化时,他便会相信团队可以交付他需要的产品,不仅仅只是客户发出请求的东西。对抗的情况就会被“是什么?”的语境取代。
所有的一切都与能够快速响应变化相关联。Rails 贯彻的 DRY 思想的强大而令人着迷的方式意味着 Rails 应用的变化引起的代码变化比其他框架响应相同变化的更少。并且当通过 Ruby 编写 Rails 应用时,Rails 的思想将被更加清晰明确地表达,变化将趋向于本地化及易于编写。单元测试和功能测试也会被深入地强调,Rails 也有对测试夹具和测试中打桩的支持,这样可以在开发者进行修改时给他们提供安全网。在适当的地方拥有一组好的测试可以减少煎熬与痛苦。
相比于不断地尝试将 Rails 流程与敏捷思想关联起来,我们决定让框架自己表达。当你阅读了本教程的章节时,尝试相像自己通过这种方式开发了网站应用,并且是与你的客户一同参与确认优先级和问题的解决上。接着,当你在第三部分阅读到更多先进的思想时,你可以想想 Rails 潜在的结构是如何让你可以更快地了解用户的需求并且采用更少的仪式。
之前关于敏捷和 Rails 的最后一点内容可能不太专业,但可以想想如果这样编程将多么快乐呀!
这本书为谁而写
这本书是为了打算构建和部署基于网站的应用的程序员而写。可以是刚了解 Rails 的程序员(或许对 Ruby 也是刚开始了解),也可以是对基础已经有所了解但想对 Rails 深入学习的程序员。
我们假设你熟悉 HTML,CSS 和 JavaScript,换句话说,也就是拥有查看网页源码的能力。你不需要成为这些方面的专家,期望你能做到的只是可以从这本书中拷贝粘贴下载的源码。
怎样阅读这本书
这本书的第一部分会确定你已经准备好了。到时你需要完成这些事情时,我们会向你介绍 Ruby,也会讲述 Rails 的概述,你需要安装 Ruby 和 Rails,你也可以用一个简单的例子验证它们已经被安装了。
下一部分我们将通过一些扩展的例子带你了解 Rails 后面的思想,我们会构建一个简单的在线商店。它不会将 Rails 的组件一一介绍(这有一章介绍模型,另一章会介绍视图等等)。这些组件被设计用于一起运行,这个部分的每章都解决了一组特定关联的任务,这些任务中会包含许多协作的组件。
许多人看起来都享受于通过这本书构建应用。如果你不想自己亲自编写,你可以欺骗自己并下载源代码。下载中包含了基于 Rails 3.0,Rails 3.1,Rails 3.2 和 Rails 4.0 的几级源码。当你打算使用 Rails 4.0 时,相应的源文件在 rails40 文件夹中。关于更多细节可以查看 README-FIRST 文件。
如果你曾经直接将下载的源码拷贝至你应用中的话你需要小心,服务器并不知道如果文件中的时间戳是旧的时需要修改。在 Mac OS X 或 Linux 上你可以通过 touch
命令更新时间戳,或者你可以编辑和保存它。或者你也可以重启 Rails 服务器。
在 259 页的第三部分——深入 Rails 中我们会了解整个 Rails 生态。这里会以函数和你已经熟悉的 Rails 能力开始。然后会介绍了一些 Rails 框架的关键依赖,这些依赖直接构成了 Rails 框架的总体交付能力。最后,会介绍一些通过 Rails 框架参数配置的流行插件,这些能力全 Rails 成为一个开发的生态,而不仅仅是一个框架。
按照这种方式,你会看见我们调整过的约定。
Ruby 技巧
尽管你需要了解 Ruby 并用于编写 Rails 应用,我们了解到许多人都是通过阅读本书同时学习 Ruby 和 Rails。我们将在第 37 页的《第 4 章,介绍 Ruby》中简要介绍 Ruby 语言。当我们需要第一次使用 Ruby 的特殊构造器时,我们会跳跃至那章的内容学习。
例如,这段中包含了一个无端使用的 Ruby 标识
:name
。在格式上支持一个空白,你将看见关于这个标识解释的引用。
活代码
我们展示的许多代码片段都是未删节的,你可以运行你下载的例子。
为了帮助你找到你的方式,如果在下载中能发现代码列表,在代码片段前会有竖线(就像下面这样)。
Download rails40/demo1/app/controllers/say_controller.rb
class SayController < ApplicationController
def hello
end
def goodbye
end
end
这里包含了下载的代码路径。如果你正在阅读电子书版本,你的电子书视图会支持超链接,你可以点击这个条目,代码就会出现在浏览器窗口中。有一些浏览器会错误地解释 HTML 模板。如果这种情况发生了,查看页面的源码将看到真正的源码。
在一些样例中包含了存在文件的修改,被修改的代码行不可能立即显示,你将在代码行的左边有一个三角型,代表着你将要修改的代码行。就像之前代码中标出的那两行。
David 说
你常常会在侧边栏看见“David Says...”。那是 David Heinemeier Hansson 在 Rails 的特定方面的独家新闻,包括基本原理,棘手问题以及建议等等。因为他是 Rails 的发明者,如果你希望成为 Rails 专家这些部分你也需要阅读。
Joe 问
Joe,一个传奇开发者,有时会根据我们正在讨论的上下文提出问题。我们边学习边回答这些问题。
这本书并不是一本 Rails 的手册。我们的经验是手册并不适合人们进行学习。反而,我们会展示许多模块和方法,无论是通过例子还是论述性的文字,有关于组件是如何使用以及如何互相适配的论述。
不过我们关于的 API 列表的文字也有几百页。不过无论你在哪里都可以通过安装 Rails 获得相应的文档,并且与这本书中的内容相比它会保持最新的内容。如果你通过 RubyGems 安装了 Rails,就可以简单地启动 gem 文档服务器(使用 gem server
命令),并通过在浏览器中输入 http://localhost:8808 访问 Rails APIs。你可以在第 265 页的 A Place for Document 中找到构建更多文档和指南的方式。
另外,Rails 产生清晰的错误返回信息也会对你有所帮助,不仅会告诉你问题出在哪里还会告诉你错误是怎么出现的,这更加有利于你追踪问题。你可以在第 124 页的 Figure 25, Our application spills its guts. 查看相应示例,如果你需要添加信息,你可以查看 10.2 节 Iteration E2: Handing Errors,查看如果添加日志声明。
你也应该获取真正的堆栈信息,那里有大量的线上资源可以帮助你。而且你还可以添加代码列表进行讨论,那有一个论坛,你可以通过勘误页面问问题和分享经验,也可以通过 wiki 页面报告错误,也可以讨论本书中的练习。
这些资源都是可分享资源。你不止是通过列表和 wiki 抛出问题,也可以编写你的建议和别人回复你的答案。
让我们开始吧!第一步就是安装 Ruby 和 Rails,并通过一个简单样例验证已经安装完成。