科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道Ruby on Rails 2.0的新特性介绍

Ruby on Rails 2.0的新特性介绍

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

Rails框架每个大的版本升级都给我们带来了相当多的新功能,新惊喜。Rails1.0带给我们完善的单元测试和集成测试;Rails1.1带给我们DataBase Migration和RJS

作者:robbin 来源:论坛整理 2007年12月24日

关键字: RUBY Rails 新特性

  • 评论
  • 分享微博
  • 分享邮件

在本页阅读全文(共2页)

万众瞩目的Ruby on Rails 2.0已经发布了,Rails框架在2004年诞生以来,一直保持着相当快的版本升级速度:2005年发布了Rails1.0版本,2006年初发布Rails1.1版本,2007年初发布Rails1.2版本,而还没有等到2008年,在2007年圣诞前夕的12月6日,Rails2.0已经发布。

  Rails框架每个大的版本升级都给我们带来了相当多的新功能,新惊喜。Rails1.0带给我们完善的单元测试和集成测试;Rails1.1带给我们DataBase Migration和RJS;Rails1.2让我们看到了REST的光明前景,那么Rails2.0又将带给我们什么呢? 我粗略的翻译了一下Rails框架作者DHH写的Rails2.0框架介绍文章,以下翻译自DHH的文章,原文在:

  http://weblog.rubyonrails.org/2007/12/7/rails-2-0-it-s-done

  在经过差不多一年的开发之后,Rails2.0终于发布了。这是一个棒极了的Rails版本,包括了大量堪称伟大的新特性,无数的bugfix和大量功能的打磨。我们花了无数的精力去打造这样一个非常完美合理的软件包。

  这也是Rails框架发展历史上的一个里程碑。我个人在Rails框架上面的开发工作已经有四年半的时间了,并且我们现在的贡献者也越来越多。我对这几年我们所做出的工作和我们一直坚持的信念感到非常的满意。我们一直在坚持这一点并且不断推动它。

  在详细的介绍Rails2.0之前,我要向那些为Rails框架做出过贡献的每一个人致以深深的谢意,不论是像一个家庭那样其乐融融的Rails核心开发团队,还是成千上万的、而且年复一年为Rails提交补丁,积极参与Rails社区人们。Rails2.0也是大规模开源软件开发社区的一个重大胜利,而你完全可以自豪于你在Rails社区当中扮演的角色和做出的贡献。干杯!

  现在让我们简单的窥一斑见全豹的看看Rails的那些闪闪发光的特性:

  Action Pack: Resources

  Controller里面充斥着大量action方法的时代已经过去了,我们对REST架构的应用进行了大量的改进和提高。首先,我们不再使用分号来隔离自定义的方法,而是采用斜线,例如原来是 /people/1;edit的URL,现在改成了 /people/1/edit.另外我们还对URL路由资源添加了命名空间的支持,因此像后台管理的接口你可以像这样非常简单的定义:

  ruby 代码

  • map.namespace(:admindo |admin|   
  •   admin.resources :products,   
  •     :collection => { :inventory => :get },   
  •     :member     => { :duplicate => :post },   
  •     :has_many   => [ :tags:images:variants ]   
  • end  
  •   这种方式可以让你按照如下的方式定义命名路由,例如:inventory_admin_products_url和 admin_product_tags_url等等。为了方便的记录所有的路由规则,我们添加了一个rake任务叫做“rake routes”,它能够列举出来routes.rb定义的所有命名路由规则。

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

      ruby 代码

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

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

      所以,新的模板格式是: action.format.renderer。例如:

      * show.erb: 不管什么格式的显示方式都使用默认的erb显示show模板

      * index.atom.builder: 用Builder库来render XML文件,输出的文件类型为RSS的AOTM类型

      * edit.iphone.haml: 使用用户自己定义的HAML render机制来输出模板内容到iPhone手机上面

      说到iPhone手机,我们可以自己造一个专用的类型来实现内部路由。当你需要类似iPhone这样的特殊的HTML接口的时候,我们所要做的就是:

      ruby 代码

  • # should go in config/initializers/mime_types.rb   
  • Mime.register_alias "text/html":iphone  
  •   
  • class ApplicationController < ActionController::Base   
  •   before_filter :adjust_format_for_iphone  
  •   
  •   private   
  •     def adjust_format_for_iphone   
  •       if request.env["HTTP_USER_AGENT"] && request.env["HTTP_USER_AGENT"][/(iPhone|iPod)/]   
  •         request.format = :iphone  
  •       end  
  •     end  
  • end  
  •   
  • class PostsController < ApplicationController   
  •   def index   
  •     respond_to do |format|   
  •       format.html   # renders index.html.erb   
  •       format.iphone # renders index.iphone.erb   
  •     end  
  •   end  
  • end   
  •   你完全可以在config/initializers/mime_types.rb里面注册自己的mime type类型的映射,这个文件默认已经提供了。

      Action Pack: Record identification

      为了驱使你使用基于资源的映射,我们对资源映射的controller和view的URL处理进行了大量的简化。我们添加了大量的命名约定,让你可以直接把model对象转化为资源映射的路由,例如:

      ruby 代码

  • # 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 Loving

      如你所期望的那样,Rails2.0的Action Pack更加贴近HTTP,并且充分利用HTTP协议,例如资源、多种视图,还有更多的呢。我们添加了一个模块来处理HTTP的Basic验证,它能够让授权的API轻松跨越SSL协议,而且他是如此的简单易用。下面是一个例子(更多的例子请参考ActionController::HttpAuthentication):

      ruby 代码

     
  • 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请求次数。使用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, assets2.example.com, assets3.example.com等等。这样浏览器可以同时向多台服务器下载资源,增加你的应用的访问速度。

      Action Pack: Security

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

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

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

      Action Pack: Exception handling

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

      ruby 代码

     
  • class PostsController < ApplicationController   
  •   rescue_from User::NotAuthorized, :with => :deny_access  
  •   
  •   protected   
  •     def deny_access   
  •       ...   
  •     end  
  • end 
  •   Action Pack: Cookie store sessions

      Rails2.0默认的Session存储机制现在是基于Cookie的方案。Session也可以不必存储在服务器的文件系统或者数据库系统里面,而是以ruby hash的格式每次作为cookie发送到客户端浏览器来保持。这样做不单单会比传统的服务器端保存Session的方式要快一些,而且完全不需要维护。你不需要在服务器上面运行cron job任务来清理session文件,也不必担心因为你忘记清理session文件导致你的服务器/tmp分区下面因为塞满了50万的session文件,从而让你的服务器crash掉。

      如果你能够遵循一些最佳实践,保持session最小化,例如只在session里面存放user_id和flash信息,那么这种session机制就会很棒。但是,如果你打算在session里面保存核弹发射代码的话,这一存储机制就不是一个好主意了。因为它们无法被加密(例如用户伪造is_admin=true),它们很容易被用户看到。如果对于你的应用程序来说,这是一个必须注意的问题,那么你就应该使用传统的session存储机制(但你首先应该先做一下调查)。

      Action Pack: New request profiler

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

      ruby 代码

     
  • $ 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和text格式的运行报告,每个步骤执行了多少时间,有了这个东西,你就可以很清楚的知道怎样优化你的应用程序了。

      Action Pack: Miscellaneous

      还有一个值得一提的是AtomFeedHelper。它可以让你更容易的使用增强的builder格式来创建RSS输出,例如:

      ruby 代码

     
  • # index.atom.builder:   
  • atom_feed do |feed|   
  •   feed.title("My great blog!")   
  •   feed.updated((@posts.first.created_at))   
  •   
  •   for post in @posts  
  •     feed.entry(post) do |entry|   
  •       entry.title(post.title)   
  •       entry.content(post.body, :type => 'html')   
  •   
  •       entry.author do |author|   
  •         author.name("DHH")   
  •       end  
  •     end  
  •   end  
  • end 
  •   在Rails2.0里面,我们已经进行了大量的性能优化,因此对于helper的调用开销已经变得很小了,而且对于简单的命名路由,我们还使用了cache,让它们能够执行的更快。

      最后我们把in_place_editor和autocomplete_for这两个helper从Rails框架当中挪出去,放到了Rails官方SVN的插件目录下面了。

      Active Record: Performance

      ActiveRecord进行了无数的bug修复和少量的调整,但是仍然有一些值得一提的亮点。我们添加了一个非常简单的查询缓存,它能够在同一个请求的过程当中记录相似的SQL调用,并且缓存查询结果。查询缓存对于那些很难用:include来解决的N+1次查询问题会非常有帮助。另外我们也彻底提高了fixtures的性能,对于大多数常规的测试套件,性能提高了50-100%。

      Active Record: Sexy migrations

      现在我们有一种新的migration文件中声明的格式。以前我们是这样写的:

      ruby 代码

     
  • 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
  •   而现在,我们可以这样写:

      ruby 代码

     
  • create_table :people do |t|   
  •   t.integer :account_id  
  •   t.string  :first_name:last_name:null => false  
  •   t.text    :description  
  •   t.timestamps   
  • end 
      • 评论
      • 分享微博
      • 分享邮件
      邮件订阅

      如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

      重磅专题
      往期文章
      最新文章