知名的 Web design 在线杂志 A List apart No.257期少见地刊出 Rails 入门介绍,心血来潮来做翻译,断断续续翻润了好几次,觉得文章看起来没什么,翻起来好长啊。
终于再度体会 text.plain 果然是最难写的格式。写投影片,做翻译比写程序还辛苦…orz
以下翻译自 Creating More Using Less Effort with Ruby on Rails by MICHAEL SLATER
如果你开发网站,想必应该听过 Ruby on Rails (RoR) 的大名。但是如果是网页设计师或前端工程师,或除了PHP没有用过其它框架,那么采用 Ruby on Rails 方案似乎会是一个很大的改变。在这篇文章中,我希望能够除去 Ruby on Rails 神秘的面纱,并说服你采取行动,这将会非常值得如果你的需求符合下述的 Ruby on Rails 甜蜜点。
学新方法去做本来就会做的事情,还要同时学新观念和新技巧,确实会花你一点时间。直接了当地说,即使是 Ruby on Rails,转换技术都将会摧毁你的生产力。然而,我相信网站开发者如果开始采用 Ruby on Rails,将变得更有生产力做出更好的网站,以及从中获得更多的乐趣。
Ruby on Rails(简称Rails)是一个完整的框架,意思是说他包含了前端跟后端。它让 “要做多种不同工作的人” 开发者能拥有极强有力的工具。即使基本上你只是前端或后端工程师,你仍可以有效率的使用 Ruby on Rails。我们可以清楚定义前端(浏览器HTML、CSS和JavaScript)和后端(Ruby和Rails框架)的接口,所以如果你只想要专注在其中一端的话,不需要全盘了解。
如果你是网页设计师或前端工程师,你会学到如何使用 Ruby on Rails 样板系统,而且学一点内嵌Ruby程序代码在View 档案。这将让你成为后端开发者更好的伙伴,因为你可以直接操作 Rails 应用程序,而不是让某人去整合HTML和CSS。
因此无论你用前端或后端工程师的角度采用 Ruby on Rails,可以想想看有哪些项目可以考虑采用?
Ruby on Rails 是 Basecamp、Blinksale、43Things、Odeo、Revolution Health、Twitter、YellowPages.com和 A List Apart 这些网页应用程序和网站的核心。这股Rails热情也扩展到许多大网络公司。Yahoo、eBay、Amazon和 AOL 都有 Ruby on Rails 专案,而ThoughtWorks 也正在建立Rails企业级应用程序。但是这么多不同的 Ruby on Rails 应用程序,有几个重要的共通最适关键。
当一个网站或网络服务有以下三个特点的时候,最适合采用 Ruby on Rails 方案:
1. 一个数据库形式的网站(译注:一个透过存取数据库,动态产生内容的网站) 或有足够规模到适合使用一个强大功能的框架。
2. 一个特别而不适用于传统的 CMS 系统 (如果 Joomla 或 Durpal 完全符合你所需,这些系统会是更好的选择)。
3. 一个全新的应用,允许开发人员开始全新的数据库跟软件架构。
这些是 Ruby on Rails 应用程序的甜蜜点。应用程序如有这些特性,一旦决定投入学习Rails,采用 RoR 将很可能会比 PHP、.NET或Java 开发的更快速。
一个最主要的理由就是 Ruby on Rails 增加生产力:建立新的应用程序、增加新功能变成容易地多。结合程序语言(Ruby)和框架(Rails)意指你将可以用更少程序代码。更少的程序和更好的架构表示当要改变时相对无痛,所以你可以迭代和实验更乐意。这将带我们有更好的网站,而且怀希望地更有乐趣去建构网站。
当然,采用主要的新工具需要时间的投资,一时没办法轻松。如果你正专注在一项目,可能不是很适合。但是如果你需要持续建构网站,而且是有一定程度的复杂,一个短期学习 Ruby on Rails 的投资,长期来说将会是值得的。
要了解我会为什么相信你可以用 Ruby on Rails 做更多事且写更少程序,让我们快速看一下 Ruby。
Ruby 是个现代的对象导向语言。在任何 Ruby 程序里,所有东西都是对象。Ruby也是一个动态语言,这表示:
Ruby 被动态直译(就像PHP),所以没有编译(像C或Java)。这加速了迭代式开发。在Ruby里,变量被使用的时候才被动态指定一个型别,降低了在其它程序语言必须定义跟设定变量。一个Ruby程序可以动态产生程序,修改即使正在执行的自己。Rails内部就使用这个能力,来让你可以简单享受所谓的 “Magic”。(你不需要了解到底这个技巧如何运作)
Ruby 是一个读写非常美妙简洁的语言,但是他的优点不只如此。正因为Ruby可以被强力扩展,Rails框架才可以将他转换成像是建造网站应用程序的专用语言。
Ruby(语言)和Rails(框架)是两回事,他们彼此在很多地方相辅相成。所有 Ruby on Rails 应用程序由Ruby写成,而Ruby的特性带给Ruby on Rails很大的影响。有些框架,像是 CakePHP,带了很多 Rails 点子过去。但是Ruby的能力和弹性给了Rails比许多别的框架更多清楚和弹性。如果你正打算投资学习一个框架,学习Ruby并不会是很大的障碍,而且回报相当可观。
许多网站并没有使用任何应用框架:你就写你要的程序和尽可能到处复制贴上你所需的程序。对小网站来说这ok,但是很快你就会失去控制,乱七八糟的程序代码将很难理解与维护。
使用像 Ruby on Rails 这样的框架,很多关于如何组织你的程序代码的决定早就已经为你想好了,而且还有一堆可供挑选使用的函式库。
另一个重要的Rails特性是使用 model-view-controller (MVC) 结构来组织每一个应用。 MVC 是一个组织软件项目的良好设计模式,当你有很多网站或有新人加入工作时,它将带给你程序代码一致性的结构。它提供个别独立的档案,有着干净的接口可以分开前端与后端的开发者。
Ruby on Rails 被设计成用来建构数据库应用程序,其中许多核心组件专注在与数据库的互动。Rails的核心函式库称作 Active Record,它实做了被称作对象-关联对应(ORM)。有了ORM,你可以操作代表数据的软件对象,然后Active Record 函式库将会处理与数据库的操作。
这听起来可能有点抽象神秘,让我们更具体些。即使不知道任何 Ruby 或任何对象导向语言,我打赌你也可以对下列的程序代码范例有感觉,以下是实际的 Ruby on Rails 程序代码。
假设你有一个书店网站,你想要加入一本新书。你可以这样写:
newbook = Book.new
你正告诉这个 “Book” 类别你要一个空的 book 对象,称作 “newbook”。你可以设定标题或任何其它属性,直观如下:
newbook.title = "Angle of Repose"
newbook.author = "Wallace Stegner"
在这同时,你有一个对象在内存。这时你需要的是:
newbook.save
…然后你的新书将会被写入数据库。Active Record 产生 SQL 告诉数据库插入一笔数据。你还可以只用少少几行的程序代码就可以做字段检查,并产生错误讯息。
现在你想要在成千上万中的数据库找那本书。只要写:
angle_of_repose = Book.find_by_title "Angle of Repose"
…于是你得到对象被称作 “angle_of_repose”,它有着所有从数据库捞出来的数据。
当然还有更多,不过也不会太多了; 操作对应网站数据的软件对象是如此自然有威力的方式。在RoR,你有丰富的软件对象对应到你的数据库表格,这些对象被组合成 MVC 系统中的 “model” 层。
你的程序代码与 model 对象互动,然后 Active Record 产生 SQL 让数据库如你所写。你不需要撰写任何数据库SQL语法。正因为不需要让你的程序与数据库直接沟通,你也可以透过更改设定轻松更换数据库软件。
要建立网页,Rails 提供样本系统可以轻易地使用一致的网页结构,插入相同的组件不需要重复程序代码,展示来自数据库的数据,显示并处理窗体。这些样板组成MVC系统的 “view” 层。
如果你是前端开发者,这是 Rails 中你应该特别专注的部份。你可以简单假设你的 “view” 档案将会处理任何你要显示出来的数据变量。正如同 PHP 档案混合了 PHP 程序代码和 HTML,一个典型的 Rails view 也是混合了 Ruby 和HTML。继续我们的书店范例,这里是一段 view 程序代码显示书的标题和作者:
<h1><%= book.title %></h1>
<p><%= book.author %></p>
Ruby 程序代码被标记成 <%= and %>; 其余则是HTML。HTML和Ruby程序代码的输出结合后,建立出网页。
Rails 被整合成支持 Prototype 和 Scriptaculous Javascript 函式库,再加上一个称作 Ruby JavaScript(RJS) 用来建构 Ajax 使用者接口的厉害机制。你可以用 Ruby 几乎完全所有事情,包括最终被执行在浏览器的 Javascript程序代码 (Rails 框架会处理这些转换)
一个 “controller” 是一整块Ruby程序代码用来与 Model 沟通,并准备数据给 view。任何view所需的数据都会先在controller 用一组变量所组成。这个 controller 也在页面加载好以后响应 Ajax 的需求。Controller 也提供多种其它功能,从使用者认证到错误处理等。
Rails 试图努力对任何事情都去提供一个合理的默认值。根据这个称作惯例胜于设定的哲学,Rails 大大降低了设定档的需要。
如果你依照Rails的惯例,将会有令人惊艳的成果,从路由request对应到正确的 controller 和 view,到验证窗体数据和显示错误讯息,都可以直接运作。与其它语言和框架比较起来,它使用了更少程序去达到更多常见的任务。
惯例胜于设定的方式对初学者可能会有点挫折,特别是如果是从一个已经存在的应用程序开始用起,因为会有隐藏的假设藏在程序代码里面。这些假设会让程序简洁,但是当你不知道的时候也会造成困惑。但当你学习Rails惯例之后,Rails的所有事情就会变成有意义了。一旦当你建构全新的网站时,你将如虎添翼般,因为有这么多已经为你定义好的东西。
Rails 的确有它的缺点。当应用程序满足上述的甜蜜点时,这些缺点可以被忽略不计,但是在极端情况却是很大的问题。
Ruby 比大多数其它程序语言还来的慢。当然这几年将会改善,但是他对少数应用程序来说这是一个缺点,的确是个问题。不过实际上对绝大多数的网站这并不是问题所在。
对 MVC 框架的架空使用也将拖慢速度。仔细看大多数的Rails应用都执行良好,但是很多 Model 操作都可以经由调校降低对数据库的存取次数。你常常可以彻底地降低数据库操作:Rails 包含了强而有利的快取系统,常常被存取的网页可以只被建立一次,然后被读取很多次。