找回密码
 注册
首页 ≡≡网络技术≡≡ 编程语言 RoR:简化Web开发

RoR:简化Web开发

灰儿 2010-12-7 17:18:10
基于Ruby编程语言的Rails恐怕是过去十年里推出的最重要的开源项目,它被誉为是有史以来效率最高的Web开发框架之一。它因可以迅速开发数据库支持的Web应用而迅速流行起来,特别是在Web 2.0领域。

Ruby on Rails(又叫RoR或者Rails)是用Ruby语言编写的一种Web应用程序框架,而Ruby是以语法简洁出名的面向对象的编程语言。2004年发布的RoR是个开源项目,最初为Web开发公司37signals LLC设计的一个项目管理工具充当基础。它很容易在Linux、Windows和Macintosh等诸多环境之间移植,能够对Web开发小组构建及维护企业网站和应用程序的速度带来显著影响。
Rails采用同样的组件设计理念和开发环境,在构建数据库支持的Web应用程序时,为开发人员在代码层面提供了几个重要优点。其中一个核心原则强调通过避免冗余代码、遵守Rails的约定,减少开发应用程序的代码。这意味着可提高性能,并且有望缩短开发时间。
由于Ruby on Rails具有的这些效率和开源特性,这种Web开发框架的知名度急剧上升。用Rails构建的知名应用程序和网站包括:37signals公司自己的Basecamp项目管理工具、Jobster工作搜索网站和Revolution Health(这是由AOL公司前CEO Steve Case主管的互动健康信息网站)。
Ruby
Ruby是一种纯粹的面向对象的开源编程语言,语法非常简洁,被称为“集Smalltalk的优雅性、Python的易用性和Perl性的实用性于一体。”作为一种解释型的脚本语言,Ruby既适用于创建临时的小脚本,也适用于编写完整的应用程序。Ruby使用直接执行模型和动态类型(dynamic typing),可以逐步开发代码;大多数情况下,添加一项功能后,可以马上试用。Ruby程序通常比Perl、Python或者C++程序来得简短。
Ruby的开发者:松本行弘说过,他需要既能提高工作效率、又易于使用的一种语言。实际上,追求编程乐趣的这种渴望也许是Ruby与其他任何语言最大的不同之处。头一次开始阅读Ruby文献时,很容易认为这是精品语言,有一群近乎狂热的用户对它顶礼膜拜。不过请记住:Perl、PGP和Python开始时几乎也是同一种情况。
每种语言都是为特定目的而设计的:易于编程、代码紧凑性、可读性、执行速度、面向特定情形(如文本处理、数据库处理或者数值计算)。即便如此,由于大多数语言都是完备的语言,几乎可以用它们处理各种事务;它们之间的实际差异在于形式、风格、大小、易用性和可管理性。松本行弘在接受网上采访时说:“各语言确实不同,但区别很有限。譬如说,Python和Ruby为程序员提供了几乎同样的功能。”
松本在设计Ruby时尽量少用“装置”及冗词赘语,譬如标题以及对变量和类说明的诸多要求。Ruby的语法是这样的:一旦你熟悉了它的词汇和风格,就可以像读自然语言那样阅读多行代码,这大大简化了程序的读解及维护。
Ruby不需要每个程序的开头部分要有长长的语句来说明结构和变量。Ruby与Perl一样也有不少功能,很容易用来处理文本文件和系统管理等任务。你可以为类添加方法,甚至在运行时为实例添加方法,从而让一个类的实例其行为有别于同一个类的其他实例。另外与Perl一样(但与Python大不相同),Ruby让你可以用多种方法来编写代码,因而它能吸引风格和个性截然不同的程序员。
Rails
Rails是用Ruby实现的一种全堆栈(full-stack)、开放源代码的编程架构,旨在快速、轻松地编写面向数据库的实际Web应用程序。它由丹麦的大学生David Heinemeier Hansson开发而成,基于他所编写的名为Basecamp的项目管理工具。Ruby on Rails在2004年7月向大众发布。
Hansson说,全堆栈架构的意思是指,构建应用程序的各层,以便协同工作,从而不必重复你自己(DRY);自上而下都使用一种语言。Rails里面的一切都是用Ruby编写的。为了实现DRY,Rail依靠两条指导原则。
第一条原则是软件要简洁,这意味着编写较少的代码行。保持代码简短可以加快开发、减少错误,并且使代码更容易理解、维护及改进。Ruby中有助于编写简短代码的一个特性就是,它假定架构本身能够并且应当处理元数据。
第二条原则是约定优于配置原则,这意味着Rails不使用配置文件,而是依靠一些简单的编程约定,通过使用应用程序代码里面已有的信息以及运行的数据库,让Rails弄清楚它需要知道哪些东西。据Hansson声称:“这意味着不需要由XML文件来说明代码已经里面说明的情况。这意味着没有编译阶段:改动代码后,就可以看它的效果。”
灰儿 楼主 2010-12-7 17:19:16
与许多快捷而粗劣的开发环境不同,Rails保留了快捷的优点,去除了粗劣的缺点。它让开发者可以根据模型-视图-控制器概念来构建简洁的应用程序。Rails是一种特殊的框架。

Ruby on Rails实战

Ruby的灵活性让开发者可以通过之前无法获得的方式,扩展应用程序。可以使用Rails的生成支架(scaffolding)这项功能,迅速把数据库支持的用户界面放到客户面前。然后,在改进代码时,生成的支架会自动撤走。只要用几行代码,就能够构建数据库支持的模型对象,Rails会填充繁琐的细节。

如今,典型开发项目存在的最常见的编程问题与构建基于Web的用户界面来管理关系数据库有关。对这类问题而言,Rails的效果要比其他任何Web开发框架好得多。优点并不局限于某一项开创性的发明。相反,Rails具有众多功能可以提高工作效率,但要充分了解Rails,最好的办法还是看看它的实际使用。

可以手动安装Rails的所有部分,不过Ruby拥有名为gem的东西。gem安装组件会访问Ruby Forge网站,然后下载名为gem的程序单元及其所有依赖项。可以使命令:gem install rails ––include-dependencies,借助gem来安装Rails,并请求所有依赖项。

Rails就这样安装好了(本文所示代码需要确保已安装了Ruby和gem),但有一个地方要注意:还需要安装某种数据库,如果已经安装了MySQL,这项工作就可以省略了。如果没安装,可以访问rubyonrails.org,了解有关Rails安装的更多细节。

启动Web服务器

在创建一个新的项目后,就可以启动服务器了。输入cd chapter-1,进入到项目所在目录。使用script/server脚本,启动为开发环境配置的WEBrick服务器的实例。如果运行Windows,就在每个脚本调用前面加上ruby,正斜杠和反斜杠都可以用。如果使用Unix版本,那么可以省去ruby关键字:

> ruby script/server

=> Booting WEBrick…

=> Rails application started on http://0.0.0.0:3000

=> Ctrl-C to shutdown server; call with --help for options

[2006-05-11 07:32:08] INFO WEBrick 1.3.1

[2006-05-11 07:32:08] INFO ruby 1.8.4 (2005-12-24) [i386-mswin32

[2006-05-11 07:32:08] INFO WEBrick::HTTPServer#start: pid=94884 port=3000

请注意这几个细节:服务器在端口3000上启动,只要编辑script/server脚本,就可以更换端口;启动了WEBrick这个纯Ruby服务器的实例; Ruby还可以在命令行上使用反斜杠作为路径分隔符,不过在Unix上,必须使用正斜杠,有些人偏爱反斜杠,因为这样可以使用MS-DOS命令提示符中的Tab键自动完成功能。

让浏览器指向http://127.0.0.1:3000或者http://localhost:3000/,就会看到Rails欢迎屏幕。用不着为请求细节而担心。现在只要知道Rails在运行、正常工作就行。到目前为止,只输入了几个词,却已经设置好了构建环境和Web服务器,并且证实服务器在运行中。在开发环境下,通常会让服务器处于工作状态,只有改变数据库设置后才需要重启动。

配置服务器

如果需要,可以配置端口、存放公共文件的目录及服务器的其他选项,只要改动script/server脚本。以下是来自该脚本的默认选项:

OPTIONS = {

:port => 3000,

:ip => "0.0.0.0",

:environment => "development",

:server_root => File.expand_path(File.dirname(__FILE_ _) + "/../public/"),

:server_type => WEBrick::SimpleServer }

通常,Ruby配置经常与代码一起编写,特别是在像这样的脚本中。“{”和“}”之间的代码是Ruby哈希图(hash map)。:key => "value"语法把:key映射成哈希图中的字符串"value"。请注意,environment => "development"字符串,它在开发模式下启动服务器。此外,开发模式可以立即访问改动的任何代码,因为Web服务器不会缓存代码。

选择服务器

Rails可在许多不同的Web服务器上运行。大多数开发工作会使用WEBrick来完成,不过可能需要在其中一款替代服务器上运行生产代码。简单看一下还有哪些服务器可供选择。

WEBrick

WEBrick是Rails的默认服务器,它完全采用Ruby编写。它支持诸多标准:用于通信的HTTP、用于网页的HTML、用于把Ruby代码嵌入到网页显示动态内容的RHTML。WEBrick有下面这些重要优点:Ruby随带,所以免费;内置在Rails中,所以不必为集成工作而操心;可以直接调用Rails程序,因为它们都是采用Ruby编写的;易于使用。

Apache

虽然WEBrick是最方便的选择,但并不是最具扩展性或者灵活性的选择。Apache Web服务器是世界上部署最广泛的Web服务器。可以使用众多插件来运行许多编程语言,或者提供其他种类的动态内容。Apache的扩展性很好,拥有出色的缓存插件,并很好地支持负载均衡器和喷射器(可有效地把请求喷射到多个Web服务器上的机器)。如果要寻找一款安全的解决方案,那么就要选Apache Web服务器。

lighttpd

Lighttpd一款轻型Web服务器,专门为提高速度而开发。它可以非常迅速地提供HTML网页和图像等静态内容,并通过名为FastCGI的应用程序接口来支持应用程序。虽然lighttpd没有Apache Web服务器那么多的灵活插件,但如果要寻找一款专业化服务器以便迅速提供静态内容和Rails应用程序,那么lighttpd也许就是答案。

Mongrel

Mongrel结合了WEBrick和lighttpd两者的优点。这种组合有望使Mongrel成为开发和生产环境的良好选择。

其他Web服务器

从理论上来说,支持CGI的任何Web服务器都能为Rails应用程序提供服务。遗憾的是,CGI与Rails一起使用,速度很慢,所以它其实不适合生产环境。不过,如果自身拥有Web服务器的专门环境下运行,可能会使用FastCGI或者SCGI接口,让它为Rails应用程序提供服务。

创建控制器

Rails使用模型、视图和控制器,把应用程序分解成各部分。我们从控制器开始入手。使用生成脚本(参阅下面的“script/generate”)来创建控制器。我们首先指定要创建的对象类型,然后指定新控制器的名称。输入:> ruby script/generate controller Greeting,可以看到,Rails已经创建了控制器:greeting_controller.rb,还获得了另外几个文件。

application.rb:整个应用程序还没有一个控制器,所以Rails创建了这个控制器,它以后会派得上用场,充当控制处理整个程序范围的问题(如安全)的一个地方。

views/greeting:Rails知道控制器和视图通常成双出现,所以它创建了名为views/greeting的目录。

greeting_controller_test.rb:Rails还为新的控制器创建了测试,因为大多数Rails开发人员创建自动的单元测试从而简化构建、维持质量。

greeting_helper.rb:Railshelper为防止重复或者繁琐代码导致视图凌乱提供了一个方便的地方。

Ruby开发人员当初开发Rails是为了解决自己的问题,后来发布该工具以解决大众的问题。这是一种注重体验的优秀设计。早期的Rails用户注意到:就在创建控制器之后,通常需要应用程序的几个额外层,于是他们改动了控制器生成器,从而减少一些输入工作。

Rails生成器可以显著提高工作效率。它可以帮助开发者生成应用程序所需的各个基本构建模块。如果忘了选项,只要输入ruby script/generate,就会看到相关用法(script/generate [options] generator [args])。

因为不同生成器会生成重叠文件,要是不小心,它们可能会有破坏性。不过,不必担心,Rails为提供了相当大的帮助。如果对生成器的输出不能肯定,最好使用“-pretend”选项来运行,看看到底会生成什么。还可以列出任何已安装生成器的选项。譬如说,输入ruby script/generate controller,即可显示用来创建控制器的选项。

还可以安装另外的生成器。譬如说,可以使用登录生成器,那样Rails可以创建基本验证架构所需的模型、视图和控制器。该生成器还会生成代码,处理来自其他版本、支架甚至Web服务的迁移。
灰儿 楼主 2010-12-7 17:20:21
运行控制器

现在可以运行程序了。把浏览器指向http://127.0.0.1:3000/greeting。会得到错误信息,告诉检索是未知动作。让我们找一下原因。在路径app/controller/greeting_controller.rb编辑新的控制器:

class GreetingController < ApplicationController

还没有告诉Rails做什么,所以得到某种错误似乎是合理的。不过,在解决这个问题之前,需要了解一点背景知识。



Rails使用动作包(Action Pack)框架来管理控制器。Web浏览器与服务器进行通信的方式是借助HTTP协议来发送请求。对这个欢迎程序而言,请求只是装入URL。URL的第一个部分识别机器,第二个部分识别Web资源。在动作包中,资源至少包括三部分:控制器、对控制器执行的某种动作,以及资源识别符。动作直接映射到控制器方法上。譬如说,就http://www.spatulas.com/shopping_cart/total/45这个URL而言,http://www.spatulas.com/识别Web服务器,shopping_cart识别控制器,total识别动作,而45识别资源——可能是购物手推车。Web服务器将入站请求转发给Rails框架中名为调度器(dispatcher)的Ruby脚本。Rails针对Web每个服务器都有一个调度器。接下来,Rails调度器解析URL,对相应控制器调用相应动作。控制器动作然后会调用方法、最终调用视图。

默认状态下,如果不指定动作就调用控制器,Rails会调用检索动作。现在,出现错误比较容易理解了。如果我们指定URL app/controller/greeting,提供了没有动作的控制器,那样Rails默认状态下使用不存在的检索动作。只要为GreetingController添加名为检索的方法,就可以解决该问题。我们只要让检索方法直接显示输出HMTL,就可以简化问题。

class GreetingController < ApplicationController

def index

render :text => "

Welcome to your first Rails application
"

end

end

保存代码,重新装入浏览器,就会得到正常网页。即使改动了一些代码,也不必重新启动服务器、重新部署应用程序或者进行其他操作,只要重新装入浏览器。这种名为快速反馈环的快速往返时间是Ruby and Rails的一个鲜明特点。新的Rails开发人员经常提到快速反馈环是对工作效率影响最大的一项功能。
灰儿 楼主 2010-12-7 17:21:30
构建视图

现在有了一个可以显示文本的控制器,但这种设计功能有限。如果想遵守Rails的MVC约定,应当在不同的视图而不是在控制器里面显示文本。这种糟糕的设计很容易补救。在视图里面显示原始文本,而不是在控制器里面显示输出。与许多Web框架一样,Rails也可以针对视图使用模板策略。对Rails而言,模板仅仅是混合了Ruby代码的HTML页面。Ruby代码在服务器上执行,为HTML页面添加动态内容。

可以利用Rails,生成视图及该视图需要的一些helper。输入generate命令(> ruby script/generate controller Greeting index)即可生成带视图index的新控制器greeting(这么做是为了把视图与控制器联系在一起)。系统问要不要覆盖控制器时,输入n表示不要。

生成器使用helper和测试文件生成视图index.rhtml。保留检索方法,那样动作包会找到该动作,而其余代码取自检索方法。如果控制器没有显示任何内容,Rails使用命令约定来找到正确视图。控制器的名称决定了视图目录,而控制器方法名称决定了视图名称。这种情况下,动作包会启动app/view/greeting/index.rhtml中的视图。不必编辑任何XML文件,也不必输入任何额外代码。只要提供一致的命名约定即可。

现在,编辑视图,可以找到这个数据:


Greeting#index


Find me in app/views/greeting/index.rhtml


结合控制器和视图

在MVC中,视图通常显示控制器提供的模型数据。我们不妨在控制器里面设置一个实例变量,然后在视图里面显示。先为控制器添加名为@welcome_message的实例变量:

class GreetingController < ApplicationController

def index

@welcome_message = "Welcome to your first Rails application"

end

end

现在,只要在标记之间添加一个Ruby表达式,就可以在视图里面显示新消息。Rails可以显示这些标签里面的表达式的值,就好像表达式的值已打印输出。以下是显示欢迎消息为一级标题(h1)的视图:
灰儿 楼主 2010-12-7 17:22:41
链接一

Rails的优点

元编程(Metaprogramming)

元编程技术使用程序来编写程序。其他框架使用扩展代码生成法,这只能让用户一次性提高工作效率,但之外收效甚微;定制脚本让用户在精心选择的少数几个点可以添加定制代码。元编程取代了这两种原始技术,消除了它们的缺点。Ruby是最适合元编程的语言之一,Rails能很好地利用这项功能。

活动记录(Active Record)

Rails推出了活动目录框架,它可以把目标保存到数据库。Rails版本的活动目录基于由Martin Fowler分类的设计模式,它发现数据库模式中的列后,会自动使用元编程技术,把它们与域对象连接起来。封装数据库表的这种方法简单、优雅、有效。

约定优于配置

面向.Net或者Java的Web开发框架大多会迫使开发者编写好多页的配置代码。如果遵守提议的命名约定,Rails不需要大量配置。实际上,只要遵守通常的约定,总的配置代码常常比类似的Java框架减少五倍或者更多。

生成支架

开发者往往在开发早期阶段编写临时代码,帮助迅速构建应用程序、看看各主要组件是如何协同运行的。Rails会自动生成所需要的许多支架。

内置测试

Rails可生成简单的自动测试,之后可以扩展。Rails还提供名为harness和fixture的支持代码,从而简化测试用例的编写及运行。随后,Ruby会利用rake实用程序来执行所有自动化测试。

开发、测试及生产三种环境

Rails提供了三种默认的环境:开发、测试及生产。每种环境的特性稍有不同,从而简化了整个软件开发周期。譬如说,Rails可为每次测试运行生成新的测试数据库副本。

还有更多功能,包括面向丰富用户界面的Ajax、重复使用视图代码的局部视图和helper、内置缓存、邮件框架以及Web服务。
灰儿 楼主 2010-12-7 17:24:03
链接二

目录组织

创建一个新的项目后,会建立一个目录树,下面是一些值得关注的目录。

app

该目录组织应用程序组件。它有多个子目录,存放了视图(视图和helper)、控制器(控制器)以及后端业务逻辑(模型)。

components

该目录存放了组件,即把模型、视图和控制器捆绑起来的独立的小应用程序。

config

该目录里面含有应用程序将来所需的少量配置代码,包括数据库配置(在database.yml中)、Rails环境结构(environment.rb)以及入站Web请求的路由转发(routes.rb)。也可以使用环境目录里面的文件,定制测试、开发及生产这三种环境的特性。

db

Rails应用程序通常会有访问数据库表的模型对象。可以利用创建并放在该目录里面的脚本来管理关系数据库。

doc

Ruby有一个框架叫RubyDoc,可以为创建的代码自动生成说明文档。可以用代码中的注释来帮助RubyDoc。该目录存放由RubyDoc生成的所有Rails和应用程序的说明文档。

lib

将库放在这里,除非这些库显然属于别人(譬如厂商的库)。

log

错误日志放在这里。Rails可以创建管理各种错误日志的脚本。这里有不同的日志用于服务器(server.log)、每个Rails环境(development.log、test.log和production.log)。

public

与Web服务器的公共目录一样,该文件存放了不会改变的Web文件,譬如JavaScript文件(public/javascripts)、图形(public/images)、样式表(public/stylesheets)和HTML文件(public)。

script

该目录存放的脚本可以启动及管理将来与Rails结合使用的各种工具。譬如说,其中有生成代码(generate)的脚本和启动Web服务器(server)的脚本。

test

编写的测试及Rails创建的测试都放在这里。有存放模拟测试(mocks)、单元测试(unit)、fixture测试(fixtures)和功能测试(functional)的子目录。

tmp

Rails使用该目录存放用于中间处理的临时文件。

vendor

第三方厂商提供的库放在这里,譬如基本的Rails发行版之外的安全库或者数据库实用程序。

除了各版本之间有细微变化外,每个Rails项目都有同样的结构,使用同样的命令约定。这种一致性具有巨大优势。可以迅速浏览不同的Rails项目,无须重新学习项目的组织结构。Rails框架本身也依赖这种一致性,因为不同的Rails框架往往会完全凭借命令约定和目录结构来发现文件。
您需要登录后才可以回帖 登录 | 注册
学习中心
站长自定义文字内容,利用碎片时间,随时随地获取优质内容。
Q设计语言 了解更多
Q Design 提供商家设计所需的指导与资源,帮商家快速完成产品设计、降低生产成本。
学习中心
站长自定义文字内容,利用碎片时间,随时随地获取优质内容。
Q设计语言 了解更多
Q Design 提供商家设计所需的指导与资源,帮商家快速完成产品设计、降低生产成本。