2009年1月16日,星期五

本周 Edge Rails 动态

发布者 Mike Gunderloy

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

本周 edge Rails 提交了 24 次(其中一个补丁也被移植到了 2.2 分支)。如果你想提前体验 Rails 2.3,现在安装一个 edge 版本是个不错的选择,如果你还没用的话。它对测试站点来说足够稳定,尽管还有一些粗糙的补丁。

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 中那样)。在底层,嵌套事务 使用保存点,因此即使在不支持真正嵌套事务的数据库上也能得到支持。还有一些魔法使其能够与测试中的事务性夹具良好配合。 提交

MemCacheStore 增强功能

Nahum Wild 贡献了一些工作(受他的 spandex_mem_cache_store 插件启发),提高了 Rails 在使用 MemCacheStore 时的性能。基本思想是为发送到 MemCacheStore 的请求维护一个每个请求的本地缓存,减少不必要的读取,从而提高站点性能。 提交

使 Active Record 回调正常工作

你可能还记得 Active Record 文档中的一句话:“如果一个 before_* 回调返回 false,所有后续的回调和关联的操作都会被取消。”你可能不知道的是,这在当前版本的 Rails 中实际上是 损坏的:如果你取消了一个 before_updatebefore_create 回调,after_save 回调仍然会运行。在 Rails 2.3 中,这将按照文档所述那样工作。 提交

TimeWithZone 的小数秒

TimeTimeWithZone 类包含一个 xmlschema 方法,用于以 XML 友好的字符串格式返回时间。从本周开始,TimeWithZone 支持与 Time 相同的参数,用于指定返回字符串中小数秒部分的位数。


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

提交

JSON 键引用

如果你查阅 "json.org" 网站上的规范,你会发现 "JSON" 结构中的所有键都必须是字符串,并且必须用双引号引用。从本周开始,Rails 会正确处理这个问题,即使是数字键。 提交

测试重构

Josh Peek 花了一些时间重构 Action Pack 中的各种测试,包括 查询字符串解析JSON 参数解析XML 参数解析多部分参数解析URL 编码参数解析的测试。虽然这项工作不会带来新功能,但它值得关注,因为这些通常不被看重的清理工作对于保持 Rails 代码的良好状态至关重要。

Object#try 的更改

讨论之后,Object#try 的语义发生了一些轻微变化:它现在会在私有方法上引发 NoMethodError,并且如果对象为 nil,则始终返回 nil提交