Rails 2.0.2 was tagged not too long ago and will hit the gem servers soon I expect. Being a minor point release there aren't many changes, but here're the ones I feel are worth mentioning:

ActionPack changes

Configurable asset hosts: You can now pass a proc to ActionController::Base.asset_host. This allows you to get by the hard-coded assumption that you have 4 asset hosts numbered 0-3 when using the '%d' wildcard (introduced in Rails 2.0.1).

I contributed this patch so I'm gonna be lazy and copy and paste most of the documentation I wrote for patch.

The example proc below generates http://assets1.example.com and http://assets2.example.com randomly.

ActionController::Base.asset_host = Proc.new { |source| "http://assets#{rand(2) + 1}.example.com" }
  => <img src="http://assets2.example.com/images/rails.png" alt="Rails" />
  => <link href="http://assets1.example.com/stylesheets/application.css" media="screen" rel="stylesheet" type="text/css" />

The proc also takes a single source parameter which is the path of the source asset. This can be used to generate a particular asset host depending on the asset path. This is useful if you have, say, images hosted elsewhere, or you want an SEO-friendly URL for your images:

ActionController::Base.asset_host = Proc.new { |source|
  if source.starts_with?('/images')
  => <img src="http://images.example.com/images/rails.png" alt="Rails" />
  => <link href="http://assets.example.com/stylesheets/application.css" media="screen" rel="stylesheet" type="text/css" />

Asset cache directories are automatically created: In Rails 2.0.1, if you tried to cache your assets (javascripts and stylesheets) in a subdirectory (example below), you either need to check it into your source control or have your deployment tool (Capistrano, etc.) create it for you. Josh Peek contributed a patch that created the subdirectory instead so you can do something like:

javascript_include_tag(:all, :cache => "cache/money")

and not have to bother about creating the 'cache' subdirectory.

Railties changes

Default database is now SQLite3: The default database is now SQLite3 instead of MySQL. Running 'rails takeover_the_world_app' will now come with a database.yml that's setup for SQLite3. To get the old behavior (where it's preconfigured for MySQL), run rails -d mysql takeover_the_world_app instead. This is mostly to make this "just work" on Mac OS X Leopard, where SQLite3 is already installed with the OS.

Template loading is faster: DHH has turned on ActionView::Base.cache_template_loading by default in the production.rb environment config file that basically means that Rails no longer does file system stat calls when loading templates. The downside is that you have to restart your Rails application to see templates changes in production mode, but it's not really that big an issue since no one should be editing templates anyway 'live' in a production application.

New rake tasks for migrations: rake db:migrate:redo to undo your last migration and re-run it - very useful when developing migrations (when you screw up, that is). rake db:migrate:reset drops the database, re-creates it, and then runs all migrations.

rake task for generating secret keys: rake secret to generate a secure key that you can use for cookie sessions. This is useful for updating Rails applications from 1.x to 2.x, which uses cookie-based sessions by default and requires a secret key.

config.action_controller.session = {
  :session_key => '_your_app_session',
  :secret      => 'some super long string that you can generate with the rake secret task'

Personally I just use super long quotes from Family Guy.

That's it! For the curious, expect Ruby 1.9 compatibility, improved caching, and big ActionPack and rendering refactoring changes in Rails 2.1.