InfoQ

新闻

Ruby on Rails 2.0正式发布

作者 Robert Bazinet 译者 高昂 发布于 2007年12月11日 上午12时23分

社区
Ruby
主题
Web框架,
Ruby on Rails
标签
Ruby on Rails

David Heinemeier Hansson(DHH)在Ruby on Rails的官方blog上宣布,经历了将近一年的开发之后,Ruby on Rails 2.0目前已经正式发布

2.0版本的Rails具备众多新的特性,并且在代码上做出了大量的修补和完善。就新版的发布,David这样写道:

Rails 2.0是Rails框架发展史上的里程碑。我投入在Ruby on Rails框架开发方面总计有四年半多的时间,并且Rails目前的开发参与者也越来越多。对这几年我们所做出的努力和坚持的信念,我感到非常的满意。并且我们坚持一贯的理念,同时不断推动Rails的发展。

在发布说明中,描述最新特性的更新列表中有很多内容。令Rails开发者最为关注的改进包含有:

  • Action Pack: Resources

在Controller之中充斥着大量action方法的情况已经不存在了,我们对RESTful方式的实现进行了大量的改进和提高。首先,我们不再使用分号来分隔自定义的方法,而是采用斜线'/'的方式,例如原先比方说/people/1;edit的URL,现在改成了 /people/1/edit。另外我们还为URL路由资源添加进了命名空间(namespace)的支持,因此像后台管理的接口可以简单的定义如下:

map.namespace(:admin) do |admin|
admin.resources :products,
:collection => { :inventory => :get },
:member => { :duplicate => :post },
:has_many => [ :tags, :images, :variants ]
end

这种方式可以使开发者按照inventory_admin_products_url和 admin_product_tags_url的方式来定义命名路径(routes)。为了方便记录所有路由规则,我们添加了一个叫做“rake routes”的rake任务,这个任务可以帮助开发者列举出routes.rb定义的所有命名路由规则。

此外我们还引入了一个新的约定,即所有基于资源的controller的默认形式都是复数形式。这样即便单个资源在不同路由规则中被多次引用,仍然可以指向同一个控制器来处理,例如:

           
# /avatars/45 => AvatarsController#show
map.resources :avatars

# /people/5/avatar => AvatarsController#show
map.resources :people, :has_one => :avatar
  • Action Pack: Multiview

Action Pack中与资源映射一起增强功能的还有MultiView。Rails已经有respond_to方法,但还可以更加深一步,把MultiView控制延伸到模板里面去。我们可以根据模板文件的后缀格式来决定使用什么render机制进行呈现。因此,show.rhtml可以写成show.rhtml.erb,这就表明是show这个action的一个默认rhtml模板,和之前在Action里面使用respond_to声明的format.html是同样的方式。此外还可以使用诸如show.csv.erb的形式,表明显示为csv格式的数据,并且使用默认的ERB来进行呈现。

所以,新的模板格式是: action.format.renderer。下面有几个例子:

  • show.erb: 对于所有格式,都使用默认的erb显示模板
  • index.atom.builder: 用外加的Builder库来呈现XML文件,之前是以rxml的形式,输出的文件类型为RSS的AOTM类型
  • edit.iphone.haml: 使用自定义的HAML模板引擎机制(默认情况下并没有包含)来render输出模板内容到iPhone手机之上

说到iPhone手机,可以自定义一个专用的类型来实现内部路由。当开发者需要类似iPhone这样的特殊HTML接口时,就可以这样去实现。

  • Action Pack: Record identification

为了让开发者尽可能使用基于资源的映射,Rails 2.0对资源映射的controller和view的URL进行了简化处理。在添加了诸多命名约定之后,可以直接把model对象转化为资源映射的路由,例如:

       
# person is a Person object, which by convention will
# be mapped to person_url for lookup
redirect_to(person)
link_to(person.name, person)
form_for(person)
  • Action Pack: 贴近HTTP方式

正如开发者期望的那样,Rails 2.0的Action Pack更加贴近HTTP并且充分利用了HTTP协议,例如资源、多种视图,以及其他更多的内容。Rails 2.0添加了一个模块来处理HTTP的基本验证,可以使得授权的API方便的实现SSL协议,而且非常简单易用。下面的例子说明了这一点(更多的例子请参考ActionController:: HttpAuthentication):

           
class PostsController < ApplicationController
USER_NAME, PASSWORD = "dhh", "secret"

before_filter :authenticate, :except => [ :index ]

def index
render :text => "Everyone can see me!"
end

def edit
render :text => "I'm only accessible if you know the password"
end

private
def authenticate
authenticate_or_request_with_http_basic do |user_name, password|
user_name == USER_NAME && password == PASSWORD
end
end
end

此外,我们使得JavaScript和CSS文件构建在一个逻辑单元之上更为简便易行,不需要让浏览器发起多次HTTP请求,分别获取每个JavaScript和CSS文件,以便减少HTTP请求次数。在production模式下,使用javascript_include_tag(:all, :cache => true)的helper把public/javascripts/目录中所有js文件封装到单独的public/javascripts/all.js文件里面,但在开发环境下,仍然保持每个文件可以独立的修改,这样便可以反复迭代而不必清理缓存。

并且添加了一些选项之后,仅用几行代码就能够让浏览器去访问多台服务器上面的资源。如果你添加如下设置:ActionController:: Base.asset_host = “assets%d.example.com”,那么Rails框架就会自动的把静态资源的请求分发到多台物理服务器上面去,例如分发到 assets1.example.com到 assets4.example.com等服务器之上。这样浏览器可以同时向多台服务器获取资源,增加你的应用的访问速度。

  • Action Pack: 安全性

能够快捷的创建出安全应用总是一件令人愉快的事情,而Rails2.0提供了大量先进功能来实现这一目标。更重要的是,Rails现在提供了一种内建的机制来处理CRSF攻击。我们在所有的HTML表单和AJAX请求中包含了一个特殊的token机制,可以及时检测到来自于其他应用的请求。所有这些安全选项,在新创建的Rails 2.0项目当中默认就是开启的状态,对于升级到Rails 2.0的应用,要开启这一个选项也很方便,可以使用ActionController::Base.protect_from_forgery来开启选项(详细的说明请参照:ActionController::RequestForgeryProtection)。

对于允许用户在应用当中提交嵌入HTML代码的情况,防止XSS攻击也变得更加简单了。之前的TextHelper#sanitize方法从过滤黑名单(很难保证安全性)转变成了验证白名单。如果你已经使用了sanitize方法,就可以自动获得更好的保护。当然你也可以自行调整sanitize方法默认允许的HTML tag,请看TextHelper#sanitize获取详情。

最后,我们还添加了对于HTTP单一cookies的支持,这一特性并不是所有的浏览器都支持,但是对于对此提供支持的浏览器就可以派上用场了。

  • Action Pack: 异常处理

大多数常见的异常都可以统一处理,而不是每个需要单独的处理。通常情况下,开发者只需要覆盖rescue_action_in_public方法,来进 行统一的异常处理。但是也有可能需要使用自己的case语句来处理特定场合的异常。因此我们现在提供了一个叫做rescue_from的类级别的宏,你可以使用这个宏来声明针对某个特定的Action来捕获异常,例如:

           
class PostsController < ApplicationController
rescue_from User::NotAuthorized, :with => :deny_access

protected
def deny_access
...
end
end
Action Pack: 用Cookie存储sessions
Rails 2.0默认的Session存储机制目前是基于Cookie实现的。这意味着Session可以不必存储在服务器的文件系统或者数据库系统里面,而是以hash的格式每次作为cookie发送到客户端浏览器来保持。这样做不仅仅会比传统的服务器端保存Session的方式要快一些,而且完全不需要维护。开发者不需要在服务器上面运行cron job任务来清理session文件,也不必担心因为你忘记清理session文件导致服务器tmp/session路径下面因为产生了50万条的session文件,而使得服务器垮掉。
  • Action Pack: 新的request profiler

在实际的应用当中找出性能瓶颈是一个艰难的工作,但在有了我们新的request profiler之后,工作会变得简单很多。request profiler可以跟踪一个完整的执行脚本,报告查找执行的结果,可以像下面的方式来使用它:

           
$ cat login_session.rb
get_with_redirect '/'
say "GET / => #{path}"
post_with_redirect '/sessions', :username => 'john', :password => 'doe'
say "POST /sessions => #{path}"
$ ./script/performance/request -n 10 login_session.rb

这样你就可以得到一份非常详尽的HTML和文本格式的运行报表,其中包含每个步骤执行多少时间,有了这样的详尽的报告,就可以很清楚的知道如何优化应用程序。

  • Action Pack: 特色功能
同样值得一提的是AtomFeedHelper。可以使用增强的Builder格式,来创建RSS Feed输出,而非原先的呈现机制。
  • Active Record: 性能
在Active Record方面,Rails 2.0进行了众多的bug修复和部分调整,但是仍然有些值得一提的特性。比方说添加了一个非常简单的查询缓存,它能够在同一个请求的过程当中记录相似的SQL调用,并且返回缓存的查询结果。查询缓存对于那些很难使用:include来解决的N+1次查询问题会非常有帮助。另外我们也彻底提高了fixtures的性能,对于大多数常规的测试工具包,性能提高了50-100%。
  • Active Record: 改进的数据迁移脚本

现在Rails 2.0有了一种新的migration文件声明格式,来替换原有的格式。以前我们是这样来写的:

create_table :people do |t|
t.column, "account_id", :integer
t.column, "first_name", :string, :null => false
t.column, "last_name", :string, :null => false
t.column, "description", :text
t.column, "created_at", :datetime
t.column, "updated_at", :datetime
end

而现在开发者可以这样写:

create_table :people do |t|
t.integer :account_id
t.string :first_name, :last_name, :null => false
t.text :description
t.timestamps
end
  • Active Record: Foxy fixtures

在fixtures里面,通过声明id属性作为主键,来构造fixtures之间的关联关系是件枯燥的工作。现在开发者可以通过如下的方式声明和编写fixtures:

           
# sellers.yml
shopify:
name: Shopify

# products.yml
pimp_cup:
seller: shopify
name: Pimp cup

如上所示,不再需要定义id属性,而是通过seller_id来关联fixtures,你现在可以直接使用fixtures的名字seller来建立关联关系。

  • Active Record: 加入XML,移出JSON
ActiveRecord支持XML的序列化已有一段时间了。在Rails2.0当中,我们还添加了XML的反序列化功能,所以现在可以这样用 Person.new.from_xml(“David“) 来获取person对象。当然我们也添加了序列化到JSON格式的功能,它和XML序列化的支持是一样的(包含嵌套的关联)。只需要写 person.to_json就可以实现这样的功能了。
  • Active Record: 更加轻量级

为了让Active Record更加简洁和通用,我们把acts_as_xxx等功能移出了Rails,放在了Rails官方的SVN插件里面。如果需要用到诸如acts_as_list这个插件的话,那么就需要进行安装,可以使用./script/plugin install acts_as_list来安装,安装好以后,acts_as_list功能又回来了,就像一切没有发生一样。

更进一步的改动是Rails 2.0把所有的商业数据库驱动全部移动到了外部的gem包里面。因此Rails 2.0仅仅自带MySQL、SQLite和PostgreSQL数据库驱动。这三个数据库是我们乐于积极测试和支持的数据库。当然,这并非意味着我们排斥商业数据库,我们只是希望它们能够在 Rails发行版本之外保持自己独立的开发和发布计划。对于商业数据库来说,这其实是一件好事情,让厂商可以在基础版本上面添加更多的异常和处理机制,使其工作的更好。

所有的商业数据库驱动现在都存放在gems包里面,符合如下的命名规则:activerecord-XYZ-adapter。所以如果安装了activerecord-oracle-adapter包,那么这台机器上面所有的各种版本的Rails应用程序都可以访问Oracle数据库,却无需在应用中修改任何一行代码。

对于新的数据库驱动来说,这种方式在Rails社区中也可以更加方便的获得支持。只要你把数据库驱动安装命名规范打包成为gem,用户就可以安装这个gem并立刻在Rails程序当中使用其赋予的功能。

  • Active Record: with_scope方法的使用
不鼓励使用ActiveRecord::Base.with_scope,这样可以避免用户在controoler,特别是filter里面对其误用。现在我们鼓励用户仅仅在model里面使用这种格式,这也是当初我们设计这项功能的初衷和保持良好实践的需要。当然,这仅仅是鼓励和劝阻,如果你在衡量得失之后,非要坚持在model之外使用with_scope的话,尽管可以使用.send(:with_scope)的方式来进行调用。
  • 移出ActionWebService,加入ActiveResource

在SOAP和REST的争论当中,Rails选择坚定的站在REST一方,这一点并不出人意料。如果项目中没有集成异构系统的需求的话,那么我们强烈不建议你使用SOAP。这是理所当然的选择,我们已经将ActionWebService摘出Rails框架的默认依赖当中。只有gem包仍然保留,这是一个重要的信息,因为这样建议开发者尽量不用它。

与此同时,我们把新的ActiveResource包从beta版本升级挪入Rails框架之内。ActiveResource很像 ActiveRecord,只不过面向的不是model而是资源。它有和ActiveRecord非常相似的API,并且可以和基于资源的Rails应用良好的整合。例如,ActiveResource提供了一个vanilla scaffold,这更容易的被开发者理解。

  • Rails: 调试器回来了

为了更好的将调试器与Rails整合在一起,我们对Rails框架整体进行了一系列改进。我最满意之处是在调试器之上新增断点功能。这不仅仅只是一个类似IRB dump那样的断点数据检测方式,而是一个真正的调试器。可以使用调试器提供的单步前进、单步后退、列举当前位置等功能。这完全得益于ruby-debug这个gem包,所以推荐安装这个gem包,之后Rails新的调试器就可以工作了。

如果想使用调试器,那么首先安装ruby-debug这个gem包,然后把“debugger”命令写在应用程序当中,接着用- debugger或者-u参数启动服务器,当代码执行到debugger命令的地方,就可以在运行服务器的终端上面直接操纵应用,完全不需要使用script/breakpointer或者其他的方式。当然在单元测试当中,也可以使用调试器。

  • Rails: 更清洁的环境配置
在Rails 2.0之前的版本,config/environment.rb文件当中尽是各种各样的启动配置信息和代码。现在你可以把这些代码信息分门别类的放在独立的文件当中,然后把文件放在config/initializers目录下面,当Rails应用启动的时候它们就会被自动加载。新的 Rails 2.0应用自带了两个这样的例子,分别是inflections.rb(用于定义单复数规则)和mime_types.rb(用于定义扩展类型)。我们建议开发者把启动配置信息放在其他文件里,而不去改动environment.rb文件。
  • Rails: 易于管理的插件顺序

现在Rails 2.0开始把很多功能从Rails中分离出来,放到插件里面,开发者也许可能安装有一些其他依赖这些功能的插件。例如在自己的acts_as_extra_cool_list插件被加载之前,需要首先加载acts_as_list插件,因为 acts_as_extra_cool_list扩展了acts_as_list。

在Rails2.0之前,需要在config.plugins里面列举所有的插件来设定插件加载次序。这种做法主要的问题是当你仅仅需要acts_as_list插件加载次序在前,而不关心其他插件加载次序的时候需要做太多工作。而现在你仅需要这样写就可以:config.plugins = [ :acts_as_list, :all ]。

David同时说明另外还有数百处的其他修正,在此不展开一一列举。

升级

如果你希望将已有的应用升级到Rails 2.0,那么推荐你应该首先将应用升级到Rails 1.2.6版本。这是由于Rails 1.2.6中包含对Rails 2.0更新功能的警告信息。如果应用程序在Rails 1.2.6上面良好运行,并且没有警告信息,那么你就可以升级到Rails 2.0了。

获取Ruby on Rails更多的信息,请访问Ruby on Rails官方站点

译注:新闻翻译过程中参考《Ruby on Rails 2.0的新特性介绍》一文,在此表示谢意。

查看英文原文:It's Official...Ruby on Rails 2.0 Released

这篇文章的翻译是抄袭的吧? 发表人 YiShan Wang 发表于 2007年12月13日 下午10时5分
Re: 这篇文章的翻译是抄袭的吧? 发表人 爱 上 发表于 2007年12月15日 上午6时14分
Re: 这篇文章的翻译是抄袭的吧? 发表人 霍 泰稳 发表于 2007年12月15日 上午8时7分
  1. 返回顶部

    这篇文章的翻译是抄袭的吧?

    2007年12月13日 下午10时5分 发表人 YiShan Wang

    编辑看一下这篇文章:http://www.javaeye.com/news/557 我摘取几段:

    Controller里面充斥着大量action方法的时代已经过去了,我们对REST架构的应用进行了大量的改进和提高。首先,我们不再使用分号来隔离自定义的方法,而是采用斜线,例如原来是 /people/1;edit的URL,现在改成了 /people/1/edit.另外我们还对URL路由资源添加了命名空间的支持,因此像后台管理的接口你可以像这样非常简单的定义:
    v.s
    在Controller之中充斥着大量action方法的情况已经不存在了,我们对RESTful方式的实现进行了大量的改进和提高。首先,我们不再使用分号来分隔自定义的方法,而是采用斜线'/'的方式,例如原先比方说/people/1;edit的URL,现在改成了 /people/1/edit。另外我们还为URL路由资源添加进了命名空间(namespace)的支持,因此像后台管理的接口可以简单的定义如下:
    这种方式可以让你按照如下的方式定义命名路由,例如:inventory_admin_products_url和 admin_product_tags_url等等。为了方便的记录所有的路由规则,我们添加了一个rake任务叫做“rake routes”,它能够列举出来routes.rb定义的所有命名路由规则。
    v.s
    这种方式可以使开发者按照inventory_admin_products_url和 admin_product_tags_url的方式来定义命名路径(routes)。为了方便记录所有路由规则,我们添加了一个叫做“rake routes”的rake任务,这个任务可以帮助开发者列举出routes.rb定义的所有命名路由规则。
    此外我们还引入了一个新的约定,即所有基于资源的controller的默认形式都是复数形式。这样即便单个资源在不同路由规则中被多次引用,仍然可以指向同一个控制器来处理,例如:
    v.s
    此外我们还引入了一个新的约定,即所有基于资源的controller默认都是复数形式的。这样即便单个资源在不同的路由规则中被多次引用,仍然可以指向同一个controller来处理,例如:
    都只是修改了少量的助词 ,其他用词都是一模一样。 再来看下面连标点符号都抄袭的例子:
    所以,新的模板格式是: action.format.renderer。例如:
    v.s
    所以,新的模板格式是: action.format.renderer。下面有几个例子:
    请注意这里的冒号是连全角都照抄了
    所以现在可以这样用 Person.new.from_xml(“David“)
    v.s
    所以现在可以这样用 Person.new.from_xml(“David“)
    这里更明显,连错误的全角引号都抄袭了 还有太多太多的内容(超过90%)我就不一一举出来了,请InfoQ网站给一个说法?

  2. 返回顶部

    Re: 这篇文章的翻译是抄袭的吧?

    2007年12月15日 上午6时14分 发表人 爱 上

    没啥好争的,都是些翻译稿而已,没什么含金量!

  3. 返回顶部

    Re: 这篇文章的翻译是抄袭的吧?

    2007年12月15日 上午8时7分 发表人 霍 泰稳

    感谢楼上朋友的指正,本新闻译者在翻译的过程中确实参考了您所提到的链接部分的内容(Robbin Fan翻译),并在文末做了注释说明,以表示对Robbin先生的尊重。事后,又和Robbin进行了沟通,双方已经达成谅解。InfoQ中文站一直支持对知识产权的保护,欢迎读者的监督! InfoQ中文站总编 霍泰稳[kevin AT infoq.com]

深度内容

和Google互补的搜索引擎Wolfram|Alpha

Wolfram|Alpha与Google究竟是什么关系,Wolfram|Alpha自己是如何定位的?Wolfram|Alaph在多大程度上是语义网搜索呢?InfoQ中文站就等等这些问题采访了Wolfram研究公司中国区商务经理王翔。

SOA契约成熟度模型

本文说明了所推荐的契约版本管理设计策略是如何与SOA成熟度模型发生联系的。文章目的是为实现版本管理和可组合性提供一个路线图。

数据服务简介

Vijay Narayanan在这篇文章中对数据服务的几个方面进行了介绍,它们都是SOA实践者和数据架构师感兴趣的内容。本文对数据服务的几个方面进行了介绍,包括需求定义,基本原理和好处、范围、开发以及消费模式。

分块云计算

在本文中,Jimmy Nilsson描述了一种他在过去数年间观察到的一种正在缓慢成长的架构风格,他把这种风格称为“分块云计算”。

豆瓣网技术架构变迁

罗马不是一天建成的,豆瓣的技术架构也是随着用户规模的增长一直在持续变化中。在本次演讲中,豆瓣的首席架构师洪强宁将与大家一起分享从上线时的单台服务器架构开始一直到现在的豆瓣架构变迁历程。

融合思想:深入探索S#arp架构

Billy McCafferty展示了S#arp架构,它在ASP.NET MVC框架的基础上,荟萃了当今的最佳实践,应用在ASP.NET Web应用程序的架构设计中。

王雷谈开源以及新兴市场计划

中国作为新兴市场中的新兴市场,是Sun在美国之外实施SSE(SUN Startup Essentials)项目重点关注的地区。在QCon Beijing 2009期间,InfoQ中文站有幸对此项目的负责人王雷先生进行了采访,探讨了关于开源、新兴市场、SSE等话题。

使用HTML5构建下一代的Web Form

HTML5 是由 WHATWG发起的,最开始的名称叫做Web Application 1.0,而后这个标准吸纳了Web Forms 2.0的标准,并一同被W3C组织所采用,合并成为下一代的HTML5标准。