技术开发 频道

Ruby on Rails为何走红企业领域?

   【IT168 专稿】在很短时间内,Ruby on Rails已经迅速在企业开发社区中蹿红,被企业开发者和系统管理员所认可。作为一个开源平台,Ruby已经证明了自己具有很多优势,可以让企业应用程序变得更强大,而不仅仅是让程序员缩短应用程序开发周期和能够创建易懂、易维护的代码那么简单。本文将向Java开发者简单的介绍Ruby on Rails,并且分析Ruby on Rails的发展,以及为什么它能在企业应用软件开发中扮演越来越重要的角色。

   了解Ruby on Rails

   1993年2月24日,Ruby作为一门开源编程语言诞生,并在1995年公开在世界范围内发布,它的发明者是来自日本的松本行弘。与脚本语言Perl或Python相类似,Ruby也是一个动态解释型的面向对象编程语言。19世纪90年代当Java作为一个商业开发平台在迅速成长的时候,Ruby依然仅仅是一个学术性的项目。由于它的语言结构中很多地方是参考的Smalltalk,所以它的最初使用者中很多人是Smalltalk用户和语言爱好者。这些早期的使用者对于Ruby的文化具有重大影响,在很大程度上推动了Ruby项目敏捷开发实践的发展。

   2004年7月Ruby on Rails第一个版本面世以后,Ruby在很短时间内迅速被人们所熟悉。开发者将Rails作为一个框架来创建数据库支持的Web应用。在这个新框架上创建的第一个应用程序是一个叫做Basecamp的基于Web的项目管理工具。

   相对来说,在Web应用开发领域,Ruby相比其他竞争语言是一个后来者。Ruby on Rails进军Web开发领域的时间恰逢PHP最辉煌的时候,当时它已经被看做创建中小规模Web应用的标准。

   Ruby on Rails与Struts、WebWork或CakePHP类似,也是使用模型-视图-控制器(MVC)设计模式。在Rails发布后,许多已经不在Ruby社区的早期开发者又从PHP或Java阵营回来了。PHP程序员之所以被吸引加入Ruby on Rails,是因为可以避开PHP缺乏结构性的缺点,以及避免把时间浪费在为每一个应用程序开发特定标准上。而Ruby on Rails对Java程序员的吸引力则在于,在现有的众多Java框架和它们的组件中存在过于臃肿和冲突的问题。Ruby on Rails本身是一个完整的解决方案,通过应用一个默认的标准实践集到一个新的项目中,它可以无缝的整合所有子组件以提供给开发者一个统一的接口,Ruby on Rails避免了其他开发平台中的很多难题。

   由于Rails对Web应用领域的现有机构是一个威胁,因此它经常被指责不适合大型软件的部署,甚至被指责不适合除了创建博客之外的任何事情。作为一个开发者,我已经将Rails应用到其他领域,诸如电子商务、社交网站、分布式计算和数据报表等,我可以非常肯定的说,上面的指责是非常不可信的。诸如NASCAR社区、Twitter和Funny or Die等越来越多的大型站点开始选择使用Rails,这些都已经无可辩驳的证明,Rails已经步入了发展的黄金时期。而事实也证明了Rails具有高度可扩展性,可以处理高达数百万条用户交易事务。

   Rails的工作原理

   Rails可以被分解成两个核心库:ActiveRecord和ActionPack。ActiveRecord是一个类似Hibernate的对象关系映射(object/relational mapping,ORM)库。ActionPack封装了核心控制器(ActionController)以及一个视图级别的模板引擎(ActionView/ERb)。一个标准的Rails安装包含了几个工具可以自动完成很广范围内的普通任务。

   在Java框架和Ruby on Rails之间存在一个比较重大的差异,这一点可从Rails的“惯例优先配置”的思想中看到。每一个Java开发人员不得不忍受折磨来维护他们项目中永远少不了的XML文件。Rails通过为文件、数据库表、列名称和目录结构设定基本的约定,基本解决了这个问题。这种转变的目的是让开发者更专注于真实的问题。

   另一个文化差别可以通过另一个在Rails社区经常提到的思想来体现——不要重复自己的代码。类似的Java实现非常难于被改变。Java和.NET解决方案通过创建工具进行“重构”或重命名一个全局引用的定义来解决这个问题。而在Rails中进行修改变得非常简单,通常需要在一个位置进行修改即可。

   1、模式

   Ruby on Rails的模型层是通过ActiveRecord来提供的。ActiveRecord是一个对象关系映射(ORM)库,这一点与Hibernate和TopLink相似。ActiveRecord对象表现来自一个数据库表的单个记录。定义一个AR类是非常简单的,并且大多数配置被隐藏在默认约定之后:

class Page < ActiveRecord::Base end

   将其与一个效果相同的Hibernate定义进行对比:

/** * @hibernate.class table="miners" */ public class Miner { private Long id; ... more column vars ... /** * @hibernate.id generator-class="native" */ public Long getId() { return id; } public void setId(Long id) { this.id = id; } ... more column getters and setters ... }

   你将注意的第一个区别是,在ActiveRecord的实现中没有结构或列名称的提及。这个代码段将参考页面表,并且自动生成Getter和Setter。这个类的一个实例的属性从数据库中得到,例如它们的类型。这些默认的约定多数可以在需要的时候可以被忽略,但是这个命名约定提供给Rails足够多的信息让你解放出来,让你解决手头上真实的问题。唯一需要进行配置的是建立最初的数据库连接;即database.yml:

development: adapter: mysql database: application_development username: application password: password host: localhost

   ActiveRecord的联合可以通过下面的代码来指定:

class User < ActiveRecord::Base has_many :articles end class Article < ActiveRecord::Base belongs_to :user end

   上面在Article类中的blongs_to语法告诉ActiveRecord,将来自user_id数据库的一个列关联到user上。它与上面的has_many和has_one宏具有相反的意思。通过这个知识,ActiveRecord可以实现某些有意思的功能,让其本身可以编写出非常具有可读性的代码。

article = Article.find(45) user = article.user users_articles = user.articles

   2、控制器

   控制器层被用来控制网站的流程。它是ActiveRecord和ActionView之间的数据中介。ActionController提供功能设施,处理和组织来自数据库和Web表单输入的数据,然后它将这些数据递交给ActionView,ActionView将这些数据插入模板并显示,在早期的Rails版本中把控制器看做创建URL路径的一种方法。在现在的社区中,每一个控制器代表着某一类抽象或具体的“资源”。这些资源通常有四个基本的操作:Create(创建)、Read(读取)、Update(更新)和Delete(删除) (CRUD)。大多数控制器具有七个核心的操作(index、show、new、create、edit、update和destroy)。

   举个例子来说,一个事件搜索页面必须查询一个事件列表,并把它往上传递给视图,而且,这个事件列表将通过某些要求的参数实现参数化。

class EventsController < ApplicationController def index @events = Event.fulltext_find(params[:search_term]) end # ... other actions end

   这儿Rails中有一些语法甜头(syntactic sugar),可以用来过滤客户端请求和以不同的方式来处理它们。这些语法有before_filter、after_filter和around_filter等。最常用的过滤器是before_filter:

class EventsController < ApplicationController before_filter :login_required, :except => [:index] # ... other actions end

   3、视图

   标准的Rails模板引擎被称为ERb。ERb看上去非常像PHP:

<% form_for todo do |f| %> <table> <tr><td><%= f.date_select :due_at %></td></tr> ... </table> <% end %>

   上面提到的CRUD体系在Rails框架的视图层上也同样存在。上面的form_for使用了通过todo ActiveRecord对象传递的信息,同时加以某些基本的约定,来为这个表单创建提交方法和URL。依附于这个表单的对象具有关于todo对性的信息。这种模式将自动的填充默认值,并且能够被定制和扩展以表现更复杂的格式。通过这些助手的帮助,Rails正在实现众多的设想,不过最终的结果是一个易懂、易维护的非常具有可读性的代码。

   Ruby on Rails的优点及在企业中发展

   Ruby社区在敏捷开发社区中具有非常强大的基础,这一点对这个语言和它的支持库的发展影响很大。开发者期望其软件和支持库可以被很好的测试。Rails在敏捷空间非常强大,因为在Rails中对需求进行修改所需要的成本非常低。这种特点已经让Rails开发者具有技术领先优势,尽管他们使用的是一个非常年轻的框架。

   Ruby可以处理非常高的代码密度。和其他结构化语言不同的是,开发者可以轻松的创建领域特定语言(domain-specific languages,DSL),它简化了潜在复杂思想的表达。你可以看到这种技术贯穿整个Rails。

   部署从一开始就是Rails的一个痛处。尽管Rails在让软件开发过程流畅化方面取得了很大的进步,但是说到部署的时候,它在很多方面却落后于时代。Rail本身不是线程安全的,因此在程序级别必须通过运行多应用程序服务器程序来建立对等基础。

   自动操作是Ruby的一个优点,在这方面一些早期的发展,例如Capistrano工具,它可以自动实现多数部署过程。但是,多数企业环境要求在开发者和操作者之间是分开的。多数早期的Rails项目没有对此区分,结果是这些工具要求对应用程序具有全面的了解,这样才能高效的完成一次部署。

   去年,JRuby项目在部署方面取得了巨大的进步缩小了这种差距。现在由Sun赞助的JRuby是在Java虚拟机(JVM)下的Ruby实现。一个通过JRuby开发运行的Rails应用程序将使用JDBC作为数据库驱动。使用一个叫作gold_spike的插件,一个Rails应用程序可以被捆绑到一个.war文件中,然后被部署到一个标准的Tomcat服务器上。微软同样也开始对此产生了兴趣,它已经开始了IronRuby项目(利用了来自IronPython项目的大量工作),以开发一个运行在.NET公共语言运行时(CLR)上的Ruby解释器版本。

   JRuby还推动了Java-Ruby的融合。导入一个用Java编写的库到Ruby中使用,对这个新的解释器来说,已经是非常轻松的事情。这为Ruby和Rails被企业所采用扫清了很多此前存在的障碍。当你让所有已经使用Java编写的代码也可以变为你的Ruby代码的时候,这是一个多么大的优势。

   Rails将走向何方?

   Rails核心团队正在推动这个框架朝着一个资源驱动的设计理念发展,在这种理念下,一个网站是由具有一些基本行为的许多资源组成的。这一点通过ActiveRecord到视图助手中的CRUD已经得到展示。Rails将增加REST软件体系风格到这种架构上。迄今为止,这已经被证明是一个非常强大的概念,可以创建大型系统中的非常复杂的Web应用程序。

   在Rails核心团队之外,也有很多工作在推动Rails进入大规模的部署和企业环境中。JRuby和IronRuby是其中的两个例子。这些开发主要是一些使用Rails开发的成功应用所带来的必然结果。而Rails社区正在继续努力发现在普通任务中低效的地方。

   近日,Ruby on Rails 2.0已经正式发布,2.0版本的Rails具有众多新特性,且在代码上做了大量的修补和完善,Ruby on Rails创始人David Heinemeier Hansson表示,Rails 2.0是Rails框架发展历史上的一个里程碑。随着Rails框架与开发者的进一步贴近,可以预见Rails将为基于动态语言的Web开发带来新一轮热潮。与此同时,一旦Rails更多的融入到逻辑更为复杂、对于分析和重构能力要求较高的企业开发领域,必然也会使得Rails迎来一个新的蓬勃发展时期。

 
Ruby on Rails创始人David Heinemeier Hansson

0
相关文章