Edge Rails has been undergoing major surgery for the past week, as the core team gets ready for a Rails 3.0 alpha release at RailsConf. We saw about 50 commits to the master branch in GitHub this week. Here’s a quick overview of the recent changes.
Rails 2.3.x Changes
Before digging into the changes on the master branch, there were a few things committed to the 2-3-stable branch. If you’re running on 2.3 edge, these are ready for you; they’re also ported to the master branch already.
:dependent => :delete
will work.set_table_name 'other_schema.customers'
commitActionView::Path Refactoring
One major chunk of change in Rails 3 this week comes from the continued work to refactor Action Pack. This time, ActionView::Path
was the target. Changes in commit include decoupling ActionView::Path
from Action Controller and Action Mailer, which gives us two major benefits. First, consolidating similar code in one place makes it easier to understand and maintain. Second, by abstracting this stuff and giving it an API, we’ll make it possible for other components to participate in the controller layer, beyond mailers and traditional controllers.
There’s also some work here to set up for the future. The plan is to decouple templates from the file system, and to decouple localization from ActionView. Stay tuned!
Pluggable JSON Backends
You may recall that recently Rails went to pluggable XML support. This week, thanks to work from Rick Olson, we have pluggable JSON. This means that you can replace the default YAML-based JSON support with the JSON gem:
ActiveSupport::JSON.backend = "JSONGem"
As part of this change, Rails now uses ActiveSupport::JSON.encode()
wherever it needs JSON. This replaces using #to_json
, and Rails team is recommending that you do the same. If you do choose to use #to_json
, you need to be aware that some libraries might override it. You can use this pattern to make sure that you’re getting Rails’ own definition of #to_json
:
gem 'json'
# JSON gem loaded, which overwrites to_json
ActiveSupport::JSON.backend = "JSONGem"
class ActiveRecord::Base
# replace the gem's to_json with Rails' own to_json
alias to_json rails_to_json
end
Active Support à la carte
In Rails 2.x, require "active_support"
pulls in all core extensions at once. In Rails 3, require "active_support"
only makes the extensions available; you have to explicitly require those you wish to use. Many of this week’s changes were concerned with breaking up Active Support so you can take just what you need and nothing more.
The end result is that it’s easy to cherry-pick features from Active Support without feeling like you’ve invited a portly gentleman for a piggyback ride. As an added bonus, all core extension documentation is now consolidated in one place: the core class. You don’t have to go poking around every extension module to find a method.
Internally, the core extensions have been reorganized so they can be directly required without assuming all of Active Support is available. Want inflections like "car".pluralize
? require "active_support/core_ext/string/inflections"
and you’ve got them. Note: the implementation and organization will change as we settle on the best way to provide core extensions.
Other Edge Changes