24 commits for edge Rails this week (with one patch ported over to the 2.2 branch as well). If you want a pre-release look at Rails 2.3, this is a fine time to install a copy of edge, if you’re not already there. It’s plenty stable enough for test sites, though there are a few rough patches yet.
Several people contributed to a big patch that gives us nested transactions in Active Record, a much-requested feature. Now you can write code like this:
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
Nested transactions let you rollback an inner transaction without affecting the state of the outer transaction. If you want a transaction to be nested, you must explicitly add the :requires_new
option; otherwise, a nested transaction simply becomes part of the parent transaction (as it does currently on Rails 2.2). Under the covers, nested transactions are using savepoints, so they’re supported even on databases that don’t have true nested transactions. There is also a bit of magic going on to make these transactions play well with transactional fixtures during testing. commit
Nahum Wild contributed some work that (inspired by his spandex_mem_cache_store plugin) that enhances the performance of Rails when using MemCacheStore
. The basic idea is to keep a per-request local cache of requests sent to MemCacheStore
, cutting down on unnecessary reads and leading to better site performance. commit
You may recall the spot in the Active Record documentation that says “If a before_*
callback returns false, all the later callbacks and the associated action are cancelled.” What you may not know is that this is actually broken in the current version of Rails: if you cancel a before_update
or before_create
callback, the after_save
callbacks still run. In Rails 2.3, this will behave the way that the documentation says it does. commit
The Time
and TimeWithZone
classes include an xmlschema
method to return the time in an XML-friendly string. As of this week, TimeWithZone
supports the same argument for specifying the number of digits in the fractional second part of the returned string that Time
does:
>> Time.zone.now.xmlschema(6)
=> "2009-01-16T13:00:06.13653Z"
If you look up the spec on the “json.org” site, you’ll discover that all keys in a JSON structure must be strings, and they must be quoted with double quotes. As of this week, Rails does the right thing here, even with numeric keys. commit
Josh Peek spent some time refactoring various tests inside of Action Pack, including those for query string parsing, JSON parameter parsing, XML parameter parsing, multipart parameter parsing, and URL-encoded parameter parsing. While you won’t see any new functionality as a result of this work, it’s worth shining a spotlight on the often-thankless cleanup that keeps the Rails code in good shape.
After some discussion, the semantics of Object#try
have changed slightly: it now raises NoMethodError
on private methods and always returns nil
if the object is nil. commit