本周为 edge Rails 提交了 24 个 commit(其中一个修补程序也已移植到 2.2 分支)。如果你尚未安装 edge 的副本,那么现在就是在预发布中了解一下 Rails 2.3 的好时机。它足够稳定,适合测试网站使用,不过还是有一些粗糙的修补程序。
多人提供了一个重要的修补程序,为我们提供了 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
Nahum Wild 贡献了一些工作,(受他自己的spandex_mem_cache_store插件的启发)他在使用 MemCacheStore
时增强了 Rails 的性能。基本思想是保留每个请求的局部缓存,发送给 MemCacheStore
,减少不必要的读取,从而提高网站性能。commit
你可能还记得Active Record 文档中有这样一个位置,指出“如果 before_*
回调返回 false,所有后续回调和关联的操作都会取消。”你可能不知道的是,在当前版本的 Rails 中,这实际上是一个缺陷:如果你取消 before_update
或 before_create
回调,after_save
回调仍然会运行。在 Rails 2.3 中,这将按照文档中所述的方式工作。commit
Time
和 TimeWithZone
类包括 xmlschema
方法,可以以适合XML的字符串形式返回时间。在本周的更新中,TimeWithZone
支持为返回字符串的分数秒部分中指定位数的相同参数,就像 Time
一样
>> Time.zone.now.xmlschema(6)
=> "2009-01-16T13:00:06.13653Z"
如果在“json.org”网站上查找规范,我们就可以发现,JSON结构中的所有键都必须为字符串,并且必须用双引号引起来。本周,Rails 在这里做了正确的事,即使在有数字键时也是如此。提交
Josh Peek 抽出一些时间对 Action Pack 内部的各种测试进行了重构,包括对查询字符串解析、JSON参数解析、XML参数解析、多部分参数解析和URL编码参数解析的那些测试。虽然你不会因为这项工作看到任何新功能,但有必要重点关注一下经常不被重视的清理工作,这些工作可以使 Rails 代码保持良好状态。
在一些讨论之后,Object#try
的语义发生了轻微的改动:它现在会在私有方法上抛出NoMethodError
,并且如果对象为 nil,它总是返回nil
。提交