[ANN] Rails 0.7.0, Action Pack 0.8.5, Active Record 0.9.5

Discussion in 'Ruby' started by David Heinemeier Hansson, Sep 5, 2004.

  1. 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

    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’s 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

    * 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,

    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
    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.

    * <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 =>

    Read about the other Content-* HTTP headers if you'd like to
    provide the user with more information (such as

    Also be aware that the document may be cached by proxies and
    The Pragma and Cache-Control headers declare how the file may be
    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
    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

    * 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’s now also possible to clone
    an Active Record safely and we’ve 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].

    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
    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
    so a Datum class becomes a data table.
    * Class name ends in "child": The "child" is replaced with
    so a NodeChild class becomes a node_children table.
    * Class name ends in an "s": No additional characters are added or
    * 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

    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

    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
    def validation
    errors.add_on_boundry_breaking "password", 3..20

    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
    David Heinemeier Hansson, Sep 5, 2004
    1. Advertisements

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. David Heinemeier Hansson
    Michael Neumann
    May 31, 2004
  2. David Heinemeier Hansson
    David Heinemeier Hansson
    Jul 24, 2004
  3. David Heinemeier Hansson
    David Heinemeier Hansson
    Aug 1, 2004
  4. David Heinemeier Hansson
    Mauricio Fernández
    Aug 6, 2004
  5. Xeno Campanoli
    Xeno Campanoli
    Jul 18, 2008

Share This Page