2009 年 1 月 16 日,星期五

本周的 Edge Rails

Mike Gunderloy 发布

2009 年 1 月 10 日 - 2009 年 1 月 16 日

本周为 edge Rails 提交了 24 个 commit(其中一个修补程序也已移植到 2.2 分支)。如果你尚未安装 edge 的副本,那么现在就是在预发布中了解一下 Rails 2.3 的好时机。它足够稳定,适合测试网站使用,不过还是有一些粗糙的修补程序。

Active Record 中的嵌套事务

多人提供了一个重要的修补程序,为我们提供了 Active Record 中的嵌套事务,这是一个备受要求的功能。现在,你可以编写这样的代码


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

嵌套事务允许你在不影响外部事务状态的情况下回滚内部事务。如果你希望一个事务成为嵌套事务,必须明确添加 :requires_new 选项;否则,嵌套事务就简单地成为父事务的一部分(正如它在当前 Rails 2.2 中所做的那样)。最终,嵌套事务是使用保存点的,因此即使在没有真正的嵌套事务的数据库中也受支持。还有一些神奇的效果,使这些事务在测试期间与事务性夹具配合良好。commit

MemCacheStore 的增强

Nahum Wild 贡献了一些工作,(受他自己的spandex_mem_cache_store插件的启发)他在使用 MemCacheStore 时增强了 Rails 的性能。基本思想是保留每个请求的局部缓存,发送给 MemCacheStore,减少不必要的读取,从而提高网站性能。commit

使 Active Record 回调正常工作

你可能还记得Active Record 文档中有这样一个位置,指出“如果 before_* 回调返回 false,所有后续回调和关联的操作都会取消。”你可能不知道的是,在当前版本的 Rails 中,这实际上是一个缺陷:如果你取消 before_updatebefore_create 回调,after_save 回调仍然会运行。在 Rails 2.3 中,这将按照文档中所述的方式工作。commit

TimeWithZone 的几分之一秒

TimeTimeWithZone 类包括 xmlschema 方法,可以以适合XML的字符串形式返回时间。在本周的更新中,TimeWithZone 支持为返回字符串的分数秒部分中指定位数的相同参数,就像 Time 一样


>> Time.zone.now.xmlschema(6)
=> "2009-01-16T13:00:06.13653Z"

commit

JSON 键引用

如果在“json.org”网站上查找规范,我们就可以发现,JSON结构中的所有键都必须为字符串,并且必须用双引号引起来。本周,Rails 在这里做了正确的事,即使在有数字键时也是如此。提交

测试重构

Josh Peek 抽出一些时间对 Action Pack 内部的各种测试进行了重构,包括对查询字符串解析JSON参数解析XML参数解析多部分参数解析URL编码参数解析的那些测试。虽然你不会因为这项工作看到任何新功能,但有必要重点关注一下经常不被重视的清理工作,这些工作可以使 Rails 代码保持良好状态。

Object#try 的更改

一些讨论之后,Object#try的语义发生了轻微的改动:它现在会在私有方法上抛出NoMethodError,并且如果对象为 nil,它总是返回nil提交