I gather that most people are now familar with the RoR suite, so I'm 
skipping the formal introductions and will just bring you the meat.

Get it all from http://www.rubyonrails.org, talk it up on #rubyonrails 
(FreeNet).

Or even easier, just do "gem install rails" (or "gem update" if you're 
already running on Gem Rails) -- you'll automatically install all the 
newest versions of the required dependencies.

Rails 0.7.0: Fixed WEBrick, new_model generator, easier fixtures
================================================================

The WEBrick dispatch has been cured of its static file illnesses, 
there√‘ a new_model generator that handles camel case models 
gracefully, and fixtures are easier than ever to create. Also a few 
other minor fixes and of course the inclusion of AP 0.8.5 and AR 0.9.5.

* Added an optional second argument to the new_model script that allows 
the programmer to specify the table name, which will used to generate a 
custom table_name method in the model and will also be used in the 
creation of fixtures. [Kevin Radloff]

* script/new_model now turns AccountHolder into account_holder instead 
of accountholder [Kevin Radloff]

* Fixed the faulty handleing of static files with WEBrick [Andreas 
Schwarz]

* Unified function_test_helper and unit_test_helper into test_helper

* Fixed bug with the automated production => test database dropping on 
PostgreSQL [dhawkins]

* create_fixtures in both the functional and unit test helper now turns 
off the log during fixture generation and can generate more than one 
fixture at a time. Which makes it possible for assignments like:

     @people, @projects, @project_access, @companies, @accounts =
       create_fixtures "people", "projects", "project_access", 
"companies", "accounts"

* Upgraded to Action Pack 0.8.5 (locally-scoped variables, partials, 
advanced send_file)

* Upgraded to Active Record 0.9.5 (better table_name guessing, cloning, 
find_all_in_collection)


Action Pack 0.8.5: Local template variables, partials, better send_file
=======================================================================

Another major upgrade that adds the ability to pass locally-scoped 
variables between templates, use the brand new partials approach to 
simplify iteration over many objects with their own template, and a 
much improved send_file method. This release also includes a bunch of 
smaller tweaks and fixes.

* Introduced passing of locally scoped variables between templates:

     You can pass local variables to sub templates by using a hash of 
with the variable
     names as keys and the objects as values:

       <%= render "shared/header", { "headline" => "Welcome", "person" 
=> person } %>

     These can now be accessed in shared/header with:

       Headline: <%= headline %>
       First name: <%= person.first_name %>

* Introduced the concept of partials as a certain type of sub templates:

     There's also a convenience method for rendering sub templates 
within the current
     controller that depends on a single object (we call this kind of 
sub templates for
     partials). It relies on the fact that partials should follow the 
naming convention
     of being prefixed with an underscore -- as to separate them from 
regular templates
     that could be rendered on their own. In the template for 
Advertiser#buy, we could have:

       <% for ad in @advertisements %>
         <%= render_partial "ad", ad %>
       <% end %>

     This would render "advertiser/_ad.rhtml" and pass the local 
variable +ad+
     for the template to display.

     == Rendering a collection of partials

     The example of partial use describes a familar pattern where a 
template needs
     to iterate over a array and render a sub template for each of the 
elements.
     This pattern has been implemented as a single method that accepts 
an array and
     renders a partial by the same name of as the elements contained 
within. So the
     three-lined example in "Using partials" can be rewritten with a 
single line:

       <%= render_collection_of_partials "ad", @advertisements %>

     So this will render "advertiser/_ad.rhtml" and pass the local 
variable +ad+ for
     the template to display.

* Improved send_file by allowing a wide range of options to be applied 
[Jeremy Kemper]:

     Sends the file by streaming it 4096 bytes at a time. This way the
     whole file doesn't need to be read into memory at once.  This makes
     it feasible to send even large files.

     Be careful to sanitize the path parameter if it coming from a web
     page.  send_file(@params['path'] allows a malicious user to
     download any file on your server.

     Options:
     * <tt>:filename</tt> - specifies the filename the browser will see.
       Defaults to File.basename(path).
     * <tt>:type</tt> - specifies an HTTP content type.
       Defaults to 'application/octet-stream'.
     * <tt>:disposition</tt> - specifies whether the file will be shown 
inline or downloaded.
       Valid values are 'inline' and 'attachment' (default).
     * <tt>:buffer_size</tt> - specifies size (in bytes) of the buffer 
used to stream
       the file.  Defaults to 4096.

     The default Content-Type and Content-Disposition headers are
     set to download arbitrary binary files in as many browsers as
     possible.  IE versions 4, 5, 5.5, and 6 are all known to have
     a variety of quirks (especially when downloading over SSL).

     Simple download:
       send_file '/path/to.zip'

     Show a JPEG in browser:
       send_file '/path/to.jpeg', :type => 'image/jpeg', :disposition => 
'inline'

     Read about the other Content-* HTTP headers if you'd like to
     provide the user with more information (such as 
Content-Description).
     http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.11

     Also be aware that the document may be cached by proxies and 
browsers.
     The Pragma and Cache-Control headers declare how the file may be 
cached
     by intermediaries.  They default to require clients to validate with
     the server before releasing cached responses.  See
     http://www.mnot.net/cache_docs/ for an overview of web caching and
     http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9
     for the Cache-Control header spec.

* Added pluralize method to the TextHelper that makes it easy to get 
strings like "1 message", "3 messages"

* Added proper escaping for the rescues [Andreas Schwartz]

* Added proper escaping for the option and collection tags [Andreas 
Schwartz]

* Fixed NaN errors on benchmarking [Jim Weirich]

* Fixed query string parsing for URLs that use the escaped versions of 
& or ; as part of a key or value

* Fixed bug with custom Content-Type headers being in addition to 
rather than instead of the default header. (This bug didn't matter with 
neither CGI or mod_ruby, but FCGI exploded on it) [With help from Ara 
T. Howard]


Active Record 0.9.5: Better table_names, cloning, find_all_in_collection
========================================================================

The table name guessing just got a brain upgrade that enables it to 
guess correctly in far more cases than the old once: Child will look 
for children, Wife for wives, and more. It√‘ now also possible to clone 
an Active Record safely and we√◊e added another method to the has_many 
macro for finding within the collection. Lots of smaller fixes as well.

* Expanded the table_name guessing rules immensely [Florian Green]. 
Documentation:

     Guesses the table name (in forced lower-case) based on the name of 
the class in the inheritance hierarchy descending directly from 
ActiveRecord. So if the hierarchy looks like: Reply < Message < 
ActiveRecord, then Message is used to guess the table name from even 
when called on Reply. The guessing rules are as follows:

     * Class name ends in "x", "ch" or "ss": "es" is appended,
       so a Search class becomes a searches table.
     * Class name ends in "y" preceded by a consonant or "qu": The "y" 
is replaced with "ies",
       so a Category class becomes a categories table.
     * Class name ends in "fe": The "fe" is replaced with "ves",
       so a Wife class becomes a wives table.
     * Class name ends in "lf" or "rf": The "f" is replaced with "ves",
       so a Half class becomes a halves table.
     * Class name ends in "person": The "person" is replaced with 
"people",
       so a Salesperson class becomes a salespeople table.
     * Class name ends in "man": The "man" is replaced with "men",
       so a Spokesman class becomes a spokesmen table.
     * Class name ends in "sis": The "i" is replaced with an "e",
       so a Basis class becomes a bases table.
     * Class name ends in "tum" or "ium": The "um" is replaced with an 
"a",
       so a Datum class becomes a data table.
     * Class name ends in "child": The "child" is replaced with 
"children",
       so a NodeChild class becomes a node_children table.
     * Class name ends in an "s": No additional characters are added or 
removed.
     * Class name doesn't end in "s": An "s" is appended,
       so a Comment class becomes a comments table.
     * Class name with word compositions: Compositions are underscored,
       so CreditCard class becomes a credit_cards table.

     Additionally, the class-level table_name_prefix is prepended to the 
table_name and the table_name_suffix is appended.
     So if you have "myapp_" as a prefix, the table name guess for an 
Account class becomes "myapp_accounts".

     You can also overwrite this class method to allow for unguessable 
links, such as a Mouse class with a link to a "mice" table. Example:

       class Mouse < ActiveRecord::Base
          def self.table_name() "mice" end
       end

   This conversion is now done through an external class called 
Inflector residing in lib/active_record/support/inflector.rb.

* Added find_all_in_collection to has_many defined collections. Works 
like this:

     class Firm < ActiveRecord::Base
       has_many :clients
     end

     firm.id # => 1
     firm.find_all_in_clients "revenue > 1000" # SELECT * FROM clients 
WHERE firm_id = 1 AND revenue > 1000

   [Requested by Dave Thomas]

* Fixed finders for inheritance hierarchies deeper than one level 
[Florian Weber]

* Added add_on_boundry_breaking to errors to accompany add_on_empty as 
a default validation method. It's used like this:

     class Person < ActiveRecord::Base
       protected
         def validation
           errors.add_on_boundry_breaking "password", 3..20
         end
     end

   This will add an error to the tune of "is too short (min is 3 
characters)" or "is too long (max is 20 characters)" if the password is 
outside the boundry. The messages can be changed by passing a third and 
forth parameter as message strings.

* Implemented a clone method that works properly with AR. It returns a 
clone of the record that hasn't been assigned an id yet and is treated 
as a new record.

* Allow for domain sockets in PostgreSQL by not assuming localhost when 
no host is specified [Scott Barron]

* Fixed that bignums are saved properly instead of attempted to be 
YAMLized [Andreas Schwartz]

* Fixed a bug in the GEM where the rdoc options weren't being passed 
according to spec [Chad Fowler]

* Fixed a bug with the exclusively_dependent option for has_many

--
David Heinemeier Hansson,
http://www.rubyonrails.org/  -- Web-application framework for Ruby
http://www.instiki.org/      -- A No-Step-Three Wiki in Ruby
http://www.basecamphq.com/   -- Web-based Project Management
http://www.loudthinking.com/ -- Broadcasting Brain
http://www.nextangle.com/    -- Development & Consulting Services