阅读更多
Rails 2.3.0今天发布了第一个RC版本,和之前版本相比它包括了大量的新特性和架构的改进,在译者看来其中一些特性更是对企业应用开发有很大帮助,比如rack中间件,engines和template带来更好的组件重用,AR的嵌套式事务。再看到今年的Rails3 on Ruby 1.9,2009年将会是Rails社区更加蓬勃发展的一年,让我们拭目以待。

你可以通过如下命令安装:
gem install rails --source http://gems.rubyonrails.org

下面是一些值得注意的Release Notes翻译:

1. 集成了Rack
能够让你利用到更多中间件带来的好处,比如绑定在每个请求的ActivieRecord QueryCache,比如改进的ParamsParser,还有能够让你定义高性能HTTP中间件的Metal模块等等。需要提一下的是原先CGI模块下面的类已经改名,在升级的时候要留意一下。

2. 改进了Rails Engines
现在你可以非常容易地将你的Rails应用集成到其他应用中去:首先routs文件会自动加载,其次如果你的插件有app目录,那么这个目录下的models/controller/helpers等也都会自动加入到Rails的加载路径。

3. ActiveRecord的改进
A. 嵌套属性,现在AR支持嵌套model的属性赋值,比如这样的model:
class Book < ActiveRecord::Base
  has_one :author
  has_many :pages

  accepts_nested_attributes_for :author, :pages
end

你在页面上可以很容易地通过表单给model赋值,具体内容请参考这个链接:http://weblog.rubyonrails.org/2009/1/26/nested-model-forms

B. 嵌套事务,这是一个期待了很久的特性,利用数据库提供的save point特性,它提供了如下这种最常见的嵌套事务:
User.transaction do
    User.create(:username => 'Admin')
    User.transaction(:requires_new => true) do
      User.create(:username => 'Regular')
      raise ActiveRecord::Rollback
    end
  end

  User.find(:all)  # => Returns only Admin


C. 动态Scope,你可能经常试用动态finder,现在scope也可以用动态写法了:
Order.scoped_by_customer_id(12)
Order.scoped_by_customer_id(12).find(:all,
  :conditions => "status = 'open'")
Order.scoped_by_customer_id(12).scoped_by_status("open")

具体内容请参考这个链接: http://ryandaigle.com/articles/2008/12/29/what-s-new-in-edge-rails-dynamic-scope-methods

D. Calllback支持多重条件
你可以在callback代码里通过组合if和unless条件来简化代码:
before_save :update_credit_rating, :if => :active,
  :unless => [:admin, :cash_only]


还有一些其他的AR改变,请参考具体的Release Notes

4. Action Controller的改进
A. 统一的Rendering代码
以前你可能这样写:
render :file => '/tmp/random_file.erb'
render :template => 'other_controller/action'
render :action => 'show'


在2.3会自动识别了,你可以这样写:
render '/tmp/random_file.erb'
render 'other_controller/action'
render 'show'
render :show


B. Application Controller改名了
或许你以前被application.rb困扰过,为什么其他controller都叫xxx_controller.rb,而这个文件这么特殊呢?现在不需要被困扰了,你可以运行rails:update:application_controlller自动转换了。

C. 加入了Digest认证支持,你可以很方便地写基于HTTP Digest认证的代码了:
class PostsController < ApplicationController
  Users = {"dhh" => "secret"}
  before_filter :authenticate

  def secret
    render :text => "Password Required!"
  end

  private
  def authenticate
    realm = "Application"
    authenticate_or_request_with_http_digest(realm) do |name|
      Users[name]
    end
  end
end


D. 更有效的Routing处理
之前我们在JavaEye的ruby论坛讨论过这个问题,现在2.3已经对这个问题进行了改进。

E.基于Rack的session lazy load
现在session默认是基于rack的懒加载,不需要再手工指定disable session的代码,并且其他基于rack的非rails应用可以和rails共享同一个session,这样和rails做基于session的集成变得更容易

还有其他一些性能上和I18N的改进,比如MIME类型处理,优化response_to, 提高cache性能等等,请参考具体的Release Notes

5. Action View的改进
A. 更聪明的render partials,现在你可以这样写代码:
render @article  # 相当于 render :partial => 'articles/_article', :object => @article
render @articles # 相当于 render :partial => 'articles/_article', :collection => @articles


B. AssetTag 时间戳缓存
你现在可以指定cache_asset_timestamps来减少生成静态资源后面时间戳带来的IO操作,需要注意的是这样你在rails应用运行期间直接修改静态资源将无法让客户端获知。

还有一些helper和其他改变,请参考具体的Release Notes

6. Active Support
A. Object#try
添加了try()方法解决nil object的问题,现在可以这样写:<%= @person.try(:name) %>,你还可以参考之前javaeye的ruby论坛类似讨论

B. Object#tap
Object#tap是对Ruby 1.9的移植,类似之前Rails的returning语法:它接受一个block,将执行后的结构作为返回值。

还有一些小改变,请参考具体的Release Notes

7. 另外一些值得注意的新特性
A. Rails Metal
Rails Metal提供了一个新机制能够让你跳过routing和Action Controller的处理,直接控制Rack的请求对象,为实现高速的HTTP中间件提供了可能,请参考:http://www.iteye.com/news/4604-rails-metal-huge-performance-improvement

B. 应用模板
2.3提供了一个模板机制,能够让你生成一套符合自己要求的rails应用框架,你只需要指定一个template.rb文件:
run "rm public/index.html"
generate(:scaffold, "person name:string")
route "map.root :controller => 'people'"
rake("db:migrate")

git :init
git :add => "."
git :commit => "-a -m 'Initial commit'"

然后生成项目的时候,指定-m: rails blog -m ~/template.rb就可以了,这个特性对于使用rails进行多个相似项目开发非常有帮助。

还有一些开发上的改进,比如简化和清除单元测试输出的Quieter Backtraces,比如开发模式下的高速启动和lazy load,对于敏捷开发都有帮助。
35
1
评论 共 16 条 请登录后发表评论
16 楼 leon0122 2009-03-24 15:21
yb31 写道

zgd 写道
无可否认,rails始终是web开发的王者現在php才是王者吧.rails還差好遠.


简直无语了……
php下辈子别想在web开发中翻身
15 楼 qianjigui 2009-03-19 11:51
等待、等待吧,毕竟不向前兼容性很可怕。
迁移一下大量插件无法使用。
14 楼 liyh 2009-03-17 17:59
学习学习,在学习。
13 楼 crystone 2009-02-15 21:15
robbin 写道

rails的版本更新太快了,期待支持ruby1.9.1的版本发布。

呵呵 什么叫agile啊?就是跑得快
12 楼 windcontrail 2009-02-03 22:36
刚刚用Rails2.2.2重写了一半原先1.2.6的东西,当作学习

这会2.3又出来了。。晕倒了。。。
11 楼 nbkangta 2009-02-03 12:30
中文的资料很少啊,跟着好累,才看了1.2.6的agile web development,和现在的rails2很大的不同啊,不提供向下的兼容性真的有点麻烦的
10 楼 hapybird 2009-02-03 10:03
支持1.9.1吗??
9 楼 鹤惊昆仑 2009-02-02 22:01
simple is hard
8 楼 fuwang 2009-02-02 17:44
虽然说永远没有尽头,可rails也跑得太快了,跟不上。
7 楼 toostupid 2009-02-02 14:59
跟它走真累,但又似乎真的越来越简约。
6 楼 backer 2009-02-02 14:53
太快了,这几天这么多新闻呢
5 楼 yb31 2009-02-02 12:42
zgd 写道

无可否认,rails始终是web开发的王者

現在php才是王者吧.rails還差好遠.
4 楼 yoyozizou 2009-02-02 12:11
三天不学习,赶不上rails
3 楼 robbin 2009-02-02 11:58
rails的版本更新太快了,期待支持ruby1.9.1的版本发布。
2 楼 fys124974704 2009-02-02 11:57
更新真快!!!它就跑啊跑,我们只能在后面追啊追!!!!!!!!!!!!!!!!
1 楼 zgd 2009-02-02 11:28
无可否认,rails始终是web开发的王者

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

Global site tag (gtag.js) - Google Analytics