Ruby on Rails之Oracle应用

您可能对 php?name=Ruby" onclick="tagshow(event)" class="t_tag">Ruby on Rails 已有所耳闻,这一新应用框架正以狂风暴雨之势席卷 Web 开发社区,尤其是 J2EE 和 PHP 编程界。   Rails 是一个功能强大的 Web 应用平台,在不到两年的时间内便赢得了众多 J2EE 和 PHP编程人员的广泛青睐。它为什么会得到 J2EE 和 PHP 编程人员的垂青?了解 Rails 的优势后您的疑问将一扫而空。其一是它使用了严格的model-view-controller (模式—视图—控制器)体系结构,赢得了自尊且醉心于设计模式的“妄客”(自我的技术迷)的尊敬 —这是 J2EE 开发人员对其情有独钟的原因。其二是使用 Rails 可以非常方便地构建基础系统 — 这是它吸引 PHP 开发人员的原因。
  但是,从数据库角度来看,Rails 有一些非常明显的缺陷。Rails 对数据库布局和应用程序需求作了许多假定。比如,Rails 假定所有表都使用一个非复合的主键。它不支持复合主键!另外,Rails 不支持双步提交;它只能用于单个数据库后端的情况。
  本文不是 Rails 的吹捧文章或是批判文章,仅是对这一技术的一个介绍。其中既有褒奖也有批评。可能有时批判显得有点严厉(在Rails 狂热爱好者眼中尤其如此),但是不要为表象所迷惑。使用任何 Web 应用框架都要讲究技巧,不管它是 J2EE、ASP.NET、或PHP。从长远来看,使用 Rails 比使用其它 Web 应用开发平台的效率更高,但是需要一定的时间来熟悉和掌握该技术。
  什么是 Ruby?什么是 Rails?   Ruby 是一种动态编程语言,它在许多方面类似于 Perl、Python 和 Smalltalk,但是它是自成体系的。Java 和PHP 编程人员似乎可以很轻松的掌握这一语言,他们是 Ruby 的最大拥护者。这一语言还吸引着其他人的加入,包括 Don Box 这位Microsoft 界的超级“妄客”。
  Ruby 的历史不短,它问世于 1993 年,先于在 1995 年便为公众知晓的 Java 和 PHP。所以尽管 Ruby是一个成熟的语言,却不如其它语言普及。这造成了 Ruby 编程语言阵营并不如 Java、PHP 和 Perl阵营强大。因此,您会发现专门针对这一语言的框架、库、书籍、网站、博客和其它资源都比较少。
  在 David Heinemeier Hanson 于近期推出了 Rails 框架后,Ruby社区推广能力不济的颓势得到了扭转,有证据表明该框架是 Ruby 诞生以来最受欢迎的应用程序。Rails 将 Ruby 编程语言扩展为极其适用于Web 开发的领域特定语言(Domain Specific Language)。它还借用了 ActiveRecord扩展,将对象关系持久性引入了 Ruby 语言。Rails让人敬而远之的原因除了它不支持复合主键和两步提交外,其最大的障碍在于要使用它您需要重新学习一门编程语言。这不是大部分人可以不求甚解一略而过的阶段,学习一门新语言虽然可以为您带来欢乐,但同时却是一条令人生畏的坎坷之途。
  但是,如果您想在自己的履历中添上浓墨重彩的一笔,Ruby 语言便是不二之选。梅花香自苦寒来,Ruby是一个完全不受商业利益左右,历经 10 年锤炼而成的语言。所以,使用 Ruby 能给您带来愉悦的享受,在很多情况下,其生产率比 Java、C和 Microsoft .NET 语言高出一个数量级。(IronPython 可能是个例外,它是 Python 语言与 Microsoft.NET 环境的接口。Python 类似于 Ruby,也是一个生产率很高的动态编程语言。)
  Rails 的用途是什么?   Rails 是一个从零开始设计而成的框架,用于构建使用关系数据库后端的动态网站。它将关键词引入了 Ruby 编程语言,简化了 Web应用程序的配置。此外,它还可以基于现有的数据库模式自动生产完整的 Web 应用程序,尽管有点粗糙。这一能力既是 Ruby的突出优点,却同时也是它的致命弱点。Rails 假定了数据库模式命名规范,如果遵循这一规范,只需执行一个命令即可生成一个基本 Web站点。但要完成这一工作需要进行一些额外配置,有时这些配置可能根本无法实现。您还会发现 Rail假定的数据库规范几乎都是可更改的,但是更改得越多,该平台的生产率就越低。这就是 Rails在开发新数据库的新应用程序时能大显神通的原因。但它却不是处理原有系统的一个上佳方案。
  示例是了解使用 Rails 开发新应用程序的最好方式。如果您安装有 Oracle数据库,且能够基于这一数据库创建新数据库和新表,那么创建一个完整的 Web 应用程序的用时将不超过 15 分钟。在本示例中,我们将使用Ruby on Rails 来构建一个产品目录。
  示例:简单的产品目录   我从去年开始投资高档漫画书,特别是 1946 年以来的旧版漫画书。我创建了一个简单的 Ruby on Rails数据库应用程序,利用它我在买卖活动中就可来方便地插入、移除、更改和删除书籍。因为是供我个人使用,所以程序自然是能减则减。本文中要构建的应用程序是我所使用的 Ruby on Rails 应用程序的“廋身”版。
  尽管 Rails 和 Oracle 数据库可用于很多平台上,但本文采用了 Windows XP,有证据表明它是 Oracle应用程序开发人员最常用的平台之一。本示例非常简单,其实就是 “Hello World” 编程语言示例的数据库版,目的是让您初尝Ruby,但它并没有展示 Rails 的所有能力,就像任何编程语言的“Hello World”示例都没有淋漓尽致地展示该语言的所有能力一样。
  如果您在运行这一示例的过程中出现了问题,原因可能有以下三种:下载的代码不对;数据库设置不当,不能连到该示例应用程序;或者是您的Windows XP 操作系统出现了问题。在开发本示例的过程中,我碰到了一些涉及版本和数据库配置的问题 —所有这些都是由缺乏知识而造成的。我从我的朋友 Michael Carland 那里学到了许多知识,这样才得以顺利完成这一示例,并使之尽量简单。
  实际情况是,实现 Ruby on Rails 和 Oracle的协同工作并不是一件简单的事情。有时会让人倍感灰心。如完全按本文中的说明,您应该不会碰到问题。但是一旦超出本示例的范围,就会出问题。Rails可以达到很高的生产率,但它是一个命令行开发环境,并不提供高级集成开发环境通常所具有的“自动化”功能。如果您不是“自力更生”型的技术人员,那目前最好不要使用 Rails。
  第 1 步:设置 Oracle 数据库   如果您对结合使用 Rails 和 Oracle 不感兴趣的话,您也不会来看这篇文章,所以您需要安装一个 Oracle数据库实例并向该数据库添加一个表。严格遵循本文中的命名规范非常重要,否则由 Rails自动生成的代码将无法正常运行(如果不进行调整)。您要创建的表如下所述:
CREATE TABLE comics (
id, NUMBER(10) NOT NULL,
title VARCHAR2(60),
  NUMBER(4),
publisher VARCHAR2(60),
PRIMARY KEY (id)
);
CREATE SEQUENCE comics_seq;
  这里提供了一个 SQL 脚本文件,您可以用它来创建表并添加一些产品数据。我建议您使用它,以便您的应用程序便与这里开发的保持一致。完成这一工作最简单的方法是按照以下步骤使用 SQL*Plus。(假定您已经安装有 Oracle 数据库并知道如何使用它。)
  使用 SQL*Plus,创建一个拥有 DBA 权限的用户,用于在这一应用程序中进行操作。
SQL> GRANT dba TO ruby IDENTIFIED BY ruby;
SQL> ALTER USER ruby DEFAULT TABLESPACE users TEMPORARY TABLESPACE temp;
SQL> EXIT
  使用 SQL 文件,创建应用程序表 COMICS,然后插入一些示例数据。
C:\> sqlplus ruby/ruby@rails @comics.sql  可能您已经发现本例中创建的 COMICS 是复数形式,这似乎不太正常,因为通常我们都将表命名为单数形式(例如 COMIC)。但是,Rails 采用了复数形式来命名表。通过 Rails 配置可以更改这一默认规范,但使用复数名称更为简便。
  第 2 步:安装 Ruby、RubyGems、Rails 和 Rails Oracle 库   要在 Windows XP 上使用 Rails,需要两个软件:带 RubyGems 的 Ruby 编程语言安装包,Rails 1.0(1.1 版已于不久前推出,但本文只讨论 1.0),和 Rails Oracle 数据库库。要下载和安装带 Gems 的 Ruby安装程序,请按以下步骤进行。
  • 访问 http://rubyinstaller.rubyforge.org/。
  • 下载“One-Click Ruby Installer”。
  • 按照说明完成安装。
    安装完 Ruby 编程平台后,您就可以使用 RubyGems 这一 Ruby 应用工具很方便地安装 Ruby 框架了。要安装 Rails 应用程序开发框架,您只需打开命令行提示符,键入一个命令:
  C:\> gems install rails -v 1.0.0 --remote    现在您已经成功安装了 Ruby、RubyGems 和 Rails,接下来可以安装一些专用代码库,以实现 Rails 应用程序和 Oracle数据库服务器的通信。要下载和安装 Oracle Rails 库,请访问http://rubyforge.org/projects/ruby-oci8,下载 ruby-oci8-0.1.13-mswin.r 到 C盘中,然后在命令窗口中执行以下命令:
  C:\> ruby ruby-oci8-0.1.13-mswin.rb    假如一切顺利,到目前为此,您就完成了 Ruby、Rails 和 Rails-Oracle 连接库的安装。下一步就是创建您的第一个 Ruby on Rails Web 应用程序了。
  第 3 步:创建 Web 应用程序   要创建一个新的 Rails 应用程序,先要按照以下步骤创建一个新的 Rails 项目:
    使用 rails 命令行应用程序创建一个新项目(将自动创建新目录)。
  C:\> rails comics_catalog    更改目录,进入前一步创建的新项目目录。
  C:\> cd comics_catalog
C:\comics_catalog>  现在您已经创建了一个新的 Rails 项目目录,下面您需要配置项目以让 Rails 应用程序使用 Rails-Oracle 连接库。   在您的项目目录中,有一个 config 目录,其中有一个 database.yml 文件。您需要使用文本编辑器来对 database.yml 文件进行编辑。该文件的原始内容如下:
development:
adapter:mysql
database:rails_development
host:localhost
usernameroot
password:

# Warning:The database defined as 'test' will be erased and
# re-generated from your development database when you run 'rake'.
# Do not set this db to the same as development or production.
test:
adapter:mysql
database:rails_test
host:localhost
usernameroot
password:

production:
adapter:mysql
database:rails_production
host:localhost
usernameroot
password:

  不同的数据库需要使用不同的连接属性。Rails 的默认设置适用于 MySQL,但您要重新配置该项目以使用 Oracle。按照下列步骤更改 development 属性。(您也可以更改 test 和 production 属性,但本文不讨论这些内容)

development:
adapter:oci
usernameruby
口令):ruby
host:RAILS

  使用 Rails 创建 Web 应用程序的方法有多种,但到目前为止最为简单的方法是使用 Rails 1.0.0 中新增的一个命令行功能,使用它可以一次构建整个应用程序。

C:\comics_catalog> ruby script/generate scaffold Comic
  除了在命令行窗口中连续出现的输出外,还发生了什么呢?Rails 代码生成器创建了模型、视图和控制器 Ruby 代码来访问 COMICS 表。在本例中您使用 Rails 的 scaffold 来创建应用程序,它将为您完成所有的工作。如果更改了数据库表,您需要重新运行 scaffold 命令。否则您的应用程序将无法工作。

  现在您已经生成了 web 应用程序,接下来就是启动 Ruby Web 服务器 — WEBRick。

C:\comics_catalog> ruby script/server
  您可以在任何时候更改您应用程序的 Ruby 代码或 COMICS 表而无需重启 web 服务器。但是,如果您更改了数据库配置文件(如 database.yml),则需要重启服务器。

  现在您可以使用 Web 浏览器来访问位于您开发计算机中的 Rails Comic Catalog 应用程序。使用如下 URL:

http://localhost:3000/comics/list

  浏览器应该显示一个您的目录中包含的漫画书列表,如图 1 所示。





图 1:产品目录表
  当您使用 scaffold 创建 Rails Web 应用程序时,它会自动创建三个 Web 组件,您可以使用这些组件来查看一个含目标数据库表所有记录的列表,以及插入、更改和删除该表中的记录。图 1 中显示了一个列表,其中包含了您在本教程开始时执行 SQL 脚本而向数据库中插入的所有示例数据。

  除了列表视图外,本程序还提供详情视图。点击任一“Show” 链接您就可以查看详情页,其中专门显示某一记录的数据。图 2 即是这种页面的一个示例。





图 2:详情页
  您还可以编辑数据库表中的任一记录。单击“Back”链接,或使用浏览器的回退按钮返回列表视图页,然后点击任一记录的“Edit”链接。图 3 显示了 COMICS 数据库表中记录之一的编辑视图示例。





图 3:编辑视图
  您也可以向 COMICS 表中添加新记录,先返回列表视图,单击“New Comic”链接。然后您将看到一个插入视图,它类似于图 3,只是所有域都是空白的。


  精通 Rails  Product Catalog 示例展示了使用 Rails 可以很方便地创建一个极其简单的表,但是这个表除用于跟踪库存外在其它方面并没有很大的用处。您可以使用 Rails 创建复杂得多的 Web 应用程序,但这需要您花费一定的精力来研究和揣摩代码。Rails 是一个易用的框架,但像任何技术一样,要精通它还需一定的时间。这里,我只建议正进行全新应用程序开发,通晓技术的人员和开发团队使用 Rails。对于在此之外的,建议您等其成熟后再使用。

  要真正精通 Rails,建议您阅读一本书,虽然今年稍后会有一系列书涌现,但目前市面上现有的一本优秀著作是 Agile Web Programming with Rails.