Annotated models

Ever working with a model and you forget what all of its columns are? Ever find yourself with your schema.rb open in a separate window so you can see what the structure is of your tables?

Dave Thomas, of Rails Pragmatic Studio fame (among a brazillion other things), hacked up a plugin that adds a comment block to the top of all of your model classes documenting the current schema for the given model. It ends up looking something like this:

  1. Schema as of Sun Feb 26 21:58:32 CST 2006 (schema version 7)
    #
  2. id :integer(11) not null
  3. quantity :integer(11)
  4. product_id :integer(11)
  5. unit_price :float
  6. order_id :integer(11)
    #
class LineItem < ActiveRecord::Base belongs_to :product

When the schema is updated, the comment is updated to reflect the new schema.

Install it with the plugin script:

script/plugin install http://svn.pragprog.com/Public/plugins/annotate_models

Run it with a custom rake task:


rake annotate_models

Check out the caveats in the README.

Thanks for sharing Dave.

Getting Real: How to build web apps like 37s

So now that we’ve forced our technology of web applications upon the world with Ruby on Rails, we decided to get opinionated about everything else involved too. Getting Real, the book is a 171-paged PDF that sells for $19 and tries to explain the guiding principles behind Basecamp, Backpack, Writeboard, Ta-da List, and Campfire. The why’s and the how’s.

If you’re doing web application work for yourself or others, there should at least be a handful of essays that gives you a bright idea or the motivation to make a change. And we’re giving away four of the 91 essays for you to sample first. Yay, free stuff!

New in Rails: Enumerable#group_by and Array#in_groups_of

Changeset 3726 adds two little methods to ActiveSupport: Enumerable#group_by and @ Array#in_groups_of@.

Enumerable#group_by is for collecting an enumerable into sets, grouped by the result of a block. Useful, for example, for grouping records by date.


     latest_transcripts.group_by(&:day).each do |day, transcripts| 
       p "#{day} -> #{transcripts.map(&:class) * ', '}"
     end
     "2006-03-01 -> Transcript"
     "2006-02-28 -> Transcript"
     "2006-02-27 -> Transcript, Transcript"
     "2006-02-26 -> Transcript, Transcript"

Enumerable#group_by will be baked right into Ruby in the future, and currently lives in the 1.9 branch.

Array#in_groups_of let’s you iterate over an array in groups of a certain size, optionally padding any remaining
slots with a specified value (nil by default).


     %w(1 2 3 4 5 6 7).in_groups_of(3) {|g| p g}
     ["1", "2", "3"]
     ["4", "5", "6"]
     ["7", nil, nil]

You gotta love the elegant encapsulation afforded by blocks! Yield.

Two Ruby articles in the latest ObjectiveView

ObjectiveView, a journal for software developers that focuses each issue on a specific topic, has two Ruby related articles in their latest issue, New Technologies Focus.

The first is an introduction to Ruby by Amy Hoy. She brings her quirky right-brained ebullience to bear, providing a thorough yet accessible tour of Ruby. She emphasizes that one of its most salient characteristics is that it makes you happy. If her writing style is any indication, she’s loving life.

ThoughtWorker Obie Fernandez serves up the other article which demonstrats what DHH’s often cited phrase “opinionated software” means and how it relates to Rails. Keep an eye out for Obie’s upcoming book, Extending Ruby on Rails (Into the Enterprise) which is expected out in Fall 2006 by Addison-Wesley.

These two tutorials provide a nice introduction to both Ruby and Rails.

Past issues of ObjectView which focus on such topics as agile development, use cases and componentized development, are also available, so check out the rest of the back issues on their website.

New for Rails 1.1: Integration Tests

If you’ve ever tried to properly test complex scenarios involving multiple controller actions, you will notice that the Rails Functional Tests fall flat. The new Integration Tests, which have just been introduced into the Rails trunk, will solve that. From the documentation:

An IntegrationTest is one that spans multiple controllers and actions, tying them all together to ensure they work together as expected. It tests more completely than either unit or functional tests do, exercising the entire stack, from the dispatcher to the database.

The provided example also shows a glimpse into the testing DSL that is used in Campfire:

class AdvancedTest < ActionController::IntegrationTest
  fixtures :people, :rooms

  def test_login_and_speak
    jamis, david = login(:jamis), login(:david)
    room = rooms(:office)

    jamis.enter(room)
    jamis.speak(room, "anybody home?")

    david.enter(room)
    david.speak(room, "hello!")
  end
end

Integration Tests will be included with Rails 1.1. Get ready!

Jim Weirich on the Rails podcast

Jim Weirich has been using Ruby for ages. He’s one of the early-adopter all-stars from the days before Rails. Rails programmers will be familiar with his wildly popular and influencial Rake and Builder projects. He’s also one of the main developers of RubyGems, which is scheduled to be included with Ruby in an upcoming release.

The enthusiasm he brings to his work and talking about his work make it clear that he has a genuine love for programming. On top of it all, cliches aside, he’s one of the nicest people you’ll ever meet.

So what a treat to have him on the
Ruby on Rails podcast. Have a listen.

Cheers to Geoffrey Grosenbach for snagging yet another great guest.

Using Ruby on Rails on Mac OS X at the Apple Developer Connection

The Apple Developer Connection has a nice Ruby on Rails tutorial called Using Ruby on Rails for Web Development on Mac OS X. As the title suggests, it is aimed at getting OS X users off the ground with Rails.

The Apple Developer Connection doesn’t supply any attribution for their articles, but this one was written by none other than Mike Clark, who along with Dave Thomas runs the always-sold-out Pragmatic Studio series of Ruby on Rails and Ajax training.

Cheers to Mike for taking the time out of his busy schedule to write up a great tutorial.

Rails is Boring and Ruby is a Toy

CUSEC 2006 in Montreal this past January featured a great line up of speakers including Chad Fowler, Kathy Sierra and David Heinemeier Hansson.

Except snow storms in the midwest kept David from making it, so with 12 hours of advanced notice, Rails Recipes author Chad Fowler flexed his jazz improv background by whipping up an entertaining, wise and cool-as-cucumber talk in place of David’s keynote. The result is Rails is Boring and Ruby is a Toy.

Thanks to SOENlive for making the talk available. You can get the rest of the conference by subscribing to the SOENlive podcast on iTunes.

List of what's coming up in Rails 1.1

Today someone on the Rails mailing list asked, innocently enough, “Is there by any chance some document available summarizing all the
(major) beautiful new stuff in Rails 1.1?” As is to be expected, he received instructions on how to do a diff between the 1.0 release tag and trunk as well as links to the CHANGELOGS. He used “summarize” carefully. Turns out there was nothing like he was looking for. Well, not for long…

Scott Raymond, of Blinksale and IconBuffet fame, rolled up his sleeves and did the dirty work for the rest of us. So, as requested, here is a summary of what will be new in Rails 1.1. Thanks Scott.

Campfire: Web-based chatting on Rails

Campfire by 37signals has launched. It’s web-based group chat for business where file transfers work reliably and where you have shared access to the logs.

It’s also dripping with delicious Ajax, courtesy of Prototype maestro Sam Stephenson, who joined 37signals in December along with Marcel Molina. So go check it out. More details about the launch on Loud Thinking and 37signals.